跳至主要内容

禁止使用类似 eval() 的方法

禁止使用 eval() 类似方法。

💭

此规则需要 类型信息 才能运行。

避免使用eval()被认为是一种良好的实践。这样做会涉及安全和性能问题,这也是许多代码风格检查器建议禁止使用eval()的原因。但是,还有一些其他方法可以传递字符串并将其解释为 JavaScript 代码,这些方法也存在类似的问题。

第一个是使用setTimeout()setInterval()setImmediateexecScript()(仅限 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 中打开

如何使用

.eslintrc.cjs
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 中尝试此规则 ↗

选项

查看 eslint/no-implied-eval 选项.

何时不使用它

如果您的项目是罕见的需要允许使用字符串参数的new Function()setTimeout()setInterval()setImmediate()execScript() 的项目,那么您可以禁用此规则。您可以考虑使用 ESLint 禁用注释 来处理这些特定情况,而不是完全禁用此规则。


类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查的规则后遇到性能下降,请查看 性能故障排除

资源

ESLint 核心 中 ❤️ 获取。