禁止使用类似 eval() 的方法
禁止使用
eval()
类似方法。
在 "plugin:@typescript-eslint/recommended-type-checked"
中扩展 ESLint 配置 会启用此规则。
此规则需要 类型信息 才能运行。
避免使用eval()
被认为是一种良好的实践。这样做会涉及安全和性能问题,这也是许多代码风格检查器建议禁止使用eval()
的原因。但是,还有一些其他方法可以传递字符串并将其解释为 JavaScript 代码,这些方法也存在类似的问题。
第一个是使用setTimeout()
、setInterval()
、setImmediate
或 execScript()
(仅限 Internet Explorer),它们都可以接受字符串代码作为第一个参数。
setTimeout('alert(`Hi!`);', 100);
或者使用new Function()
const fn = new Function('a', 'b', 'return a + b');
这被认为是隐式的eval()
,因为传递了一个字符串代码来解释。setInterval()
、setImmediate()
和 execScript()
也可以这样做。它们都在全局范围内解释 JavaScript 代码。
最佳实践是避免使用new Function()
或 execScript()
,并始终为setTimeout()
、setInterval()
和 setImmediate()
的第一个参数使用函数。
示例
此规则旨在通过使用new Function()
、setTimeout()
、setInterval()
、setImmediate()
或 execScript()
来消除隐式的eval()
。
- ❌ 错误
- ✅ 正确
setTimeout('alert(`Hi!`);', 100);
setInterval('alert(`Hi!`);', 100);
setImmediate('alert(`Hi!`)');
execScript('alert(`Hi!`)');
window.setTimeout('count = 5', 10);
window.setInterval('foo = bar', 10);
const fn = '() = {}';
setTimeout(fn, 100);
const fn = () => {
return 'x = 10';
};
setTimeout(fn(), 100);
const fn = new Function('a', 'b', 'return a + b');
在 Playground 中打开setTimeout(function () {
alert('Hi!');
}, 100);
setInterval(function () {
alert('Hi!');
}, 100);
setImmediate(function () {
alert('Hi!');
});
execScript(function () {
alert('Hi!');
});
const fn = () => {};
setTimeout(fn, 100);
const foo = {
fn: function () {},
};
setTimeout(foo.fn, 100);
setTimeout(foo.fn.bind(this), 100);
class Foo {
static fn = () => {};
}
setTimeout(Foo.fn, 100);
在 Playground 中打开如何使用
module.exports = {
"rules": {
// Note: you must disable the base rule as it can report incorrect errors
"no-implied-eval": "off",
"@typescript-eslint/no-implied-eval": "error"
}
};
在 Playground 中尝试此规则 ↗
选项
何时不使用它
如果您的项目是罕见的需要允许使用字符串参数的new Function()
或 setTimeout()
、setInterval()
、setImmediate()
和 execScript()
的项目,那么您可以禁用此规则。您可以考虑使用 ESLint 禁用注释 来处理这些特定情况,而不是完全禁用此规则。
类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查的规则后遇到性能下降,请查看 性能故障排除。