跳到主要內容

no-implied-eval

不允許使用 eval()-類似的方法。

正在延伸 「plugin:@typescript-eslint/recommended-type-checked" ESLint 組態 中啟用這項規則。

💭

這項規則需要 類型資訊 才能執行。

避免使用 eval() 是一種良好的做法。這樣做會牽涉到安全性與效能問題,這就是許多 linter 建議不允許使用 eval() 的原因。不過,還有其他方法可以傳入字串並將其解釋為 JavaScript 程式碼,這會產生類似的問題。

第一個方法是使用 setTimeout()setInterval()setImmediateexecScript() (僅限 Internet Explorer),所有這些方法都可以接受字串程式碼作為它們的第一個參數

setTimeout('alert(`Hi!`);', 100);

或使用 new Function()

const fn = new Function('a', 'b', 'return a + b');

這是一個暗示的 eval(),因為傳入的程式碼字串可以被解釋。setInterval()setImmediate()execScript() 也能做到同樣的事情。這些指令碼都會在全域範圍內解釋 JavaScript 程式碼。

最佳範例是避免使用 new Function()execScript(),並在 setTimeout()setInterval()setImmediate() 的第一個引數中使用一個函式。

範例

此規則旨在透過使用 new Function()setTimeout()setInterval()setImmediate()execScript() 來排除暗示的 eval()

setTimeout('alert(`Hi!`);', 100);

setInterval('alert(`Hi!`);', 100);

setImmediate('alert(`Hi!`)');

execScript('alert(`Hi!`)');

window.setTimeout('count = 5', 10);

window.setInterval('foo = bar', 10);

const fn = '() = {}';
setTimeout(fn, 100);

const fn = () => {
return 'x = 10';
};
setTimeout(fn(), 100);

const fn = new Function('a', 'b', 'return a + b');
在遊樂場中開啟

如何使用

.eslintrc.cjs
module.exports = {
"rules": {
// Note: you must disable the base rule as it can report incorrect errors
"no-implied-eval": "off",
"@typescript-eslint/no-implied-eval": "error"
}
};

在遊樂場中嘗試此規則 ↗

選項

請參閱 eslint/no-implied-eval 選項

什麼時候不使用

如果您的專案很特殊,需要允許 new Function() 或在 setTimeout()setInterval()setImmediate()execScript() 中使用字串引數,則可以停用這個規則。您可以考慮在這些特定情況中使用 ESLint 停用註解,而不是完全停用此規則。


類型檢查的程式碼檢查規則比傳統的程式碼檢查規則強大,但還需要設定 類型檢查的程式碼檢查。如果您在啟用類型檢查規則後遇到效能降低的情況,請參閱 效能疑難排解

資源

取自於 ESLint 核心,含 ❤️。