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*/
;
;
;
;
;
此規則的正確程式碼範例
在 Playground 中開啟
/*eslint no-implied-eval: "error"*/
setTimeout(function() {
alert("Hi!");
}, 100);
setInterval(function() {
alert("Hi!");
}, 100);
何時不該使用
如果您想允許 setTimeout()
和 setInterval()
使用字串參數,那麼您可以安全地停用此規則。
相關規則
版本
此規則在 ESLint v0.0.7 中引入。