# 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()。因此,当任一函数使用字符串作为第一个参数时,它会发出警告。
此规则的错误代码示例:
/*eslint no-implied-eval: "error"*/
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() 带有字符串参数,那么您可以安全地禁用此规则。