版本

no-implied-eval

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

避免在 JavaScript 中使用 eval() 被认为是一种良好的实践。这样做会涉及安全和性能方面的影响,这就是为什么许多代码检查工具(包括 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()。因此,当这两个函数以字符串作为第一个参数使用时,它会发出警告。

此规则的错误代码示例

在游乐场中打开
/*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);

此规则的正确代码示例

在游乐场中打开
/*eslint no-implied-eval: "error"*/

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

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

何时不使用它

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

版本

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

资源

更改语言