版本

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()。因此,當任一函式將字串作為第一個參數使用時,它會發出警告。

此規則的錯誤程式碼範例

在 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 中引入。

資源

變更語言