版本

no-implied-eval

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

在 JavaScript 中避免使用 eval() 被认为是最佳实践。这样做涉及到安全性和性能方面的问题,这就是为什么许多 linter(包括 ESLint)建议禁用 eval()。然而,还有一些其他方法可以传递字符串并将其解释为 JavaScript 代码,这些方法也存在类似的担忧。

第一种是使用 setTimeout()setInterval()execScript() (仅限 Internet Explorer),它们都可以接受 JavaScript 代码字符串作为它们的第一个参数。例如

setTimeout("alert('Hi!');", 100);

这被认为是隐式 eval(),因为 JavaScript 代码字符串被传递进去进行解释。setInterval()execScript() 也可以这样做。两者都在全局作用域中解释 JavaScript 代码。对于 setTimeout()setInterval(),第一个参数也可以是一个函数,这被认为更安全且性能更高

setTimeout(function() {
    alert("Hi!");
}, 100);

最佳实践始终是对 setTimeout()setInterval() 的第一个参数使用函数(并避免 execScript())。

规则详情

此规则旨在通过使用 setTimeout()setInterval()execScript() 来消除隐式 eval()。因此,当使用字符串作为第一个参数时,它会发出警告。

此规则的错误代码示例

在 Playground 中打开
/*eslint no-implied-eval: "error"*/
/*global window*/

setTimeout("alert('Hi!');", 100);

setInterval("alert('Hi!');", 100);

execScript("alert('Hi!')");

window.setTimeout("count = 5", 10);

window.setInterval("foo = bar", 10);

此规则的正确代码示例

在 Playground 中打开
/*eslint no-implied-eval: "error"*/

setTimeout(function() {
    alert("Hi!");
}, 100);

setInterval(function() {
    alert("Hi!");
}, 100);

何时不使用

如果您想允许带有字符串参数的 setTimeout()setInterval(),那么您可以安全地禁用此规则。

版本

此规则在 ESLint v0.0.7 中引入。

资源

更改语言