版本

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

資源

變更語言