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