no-implied-eval
不允許使用
eval()
-類似的方法。
正在延伸 「plugin:@typescript-eslint/recommended-type-checked"
在 ESLint 組態 中啟用這項規則。
這項規則需要 類型資訊 才能執行。
避免使用 eval()
是一種良好的做法。這樣做會牽涉到安全性與效能問題,這就是許多 linter 建議不允許使用 eval()
的原因。不過,還有其他方法可以傳入字串並將其解釋為 JavaScript 程式碼,這會產生類似的問題。
第一個方法是使用 setTimeout()
、setInterval()
、setImmediate
或 execScript()
(僅限 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');
在遊樂場中開啟setTimeout(function () {
alert('Hi!');
}, 100);
setInterval(function () {
alert('Hi!');
}, 100);
setImmediate(function () {
alert('Hi!');
});
execScript(function () {
alert('Hi!');
});
const fn = () => {};
setTimeout(fn, 100);
const foo = {
fn: function () {},
};
setTimeout(foo.fn, 100);
setTimeout(foo.fn.bind(this), 100);
class Foo {
static fn = () => {};
}
setTimeout(Foo.fn, 100);
在遊樂場中開啟如何使用
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 停用註解,而不是完全停用此規則。
類型檢查的程式碼檢查規則比傳統的程式碼檢查規則強大,但還需要設定 類型檢查的程式碼檢查。如果您在啟用類型檢查規則後遇到效能降低的情況,請參閱 效能疑難排解。