# no-eval
禁止使用 eval()
JavaScript 的 eval()
函数有潜在的危险并且经常被误用。在不受信任的代码上使用 eval()
可以打开一个程序,使其遭受多种不同的注入攻击。在大多数情况下使用 eval()
可以替代解决问题的更好的替代方法。
var obj = { x: "foo" },
key = "x",
value = eval("obj." + key);
# 规则详情
此规则旨在通过禁止使用 eval()
函数来防止潜在危险、不必要和缓慢的代码。因此,每当使用 eval()
功能时,它都会发出警告。
此规则的错误代码示例:
/*eslint no-eval: "error"*/
var obj = { x: "foo" },
key = "x",
value = eval("obj." + key);
(0, eval)("var a = 0");
var foo = eval;
foo("var a = 0");
// This `this` is the global object.
this.eval("var a = 0");
当 browser
环境设置为 true
时,此规则的附加错误代码示例:
/*eslint no-eval: "error"*/
/*eslint-env browser*/
window.eval("var a = 0");
当 node
环境设置为 true
时,此规则的附加错误代码示例:
/*eslint no-eval: "error"*/
/*eslint-env node*/
global.eval("var a = 0");
此规则的正确代码示例:
/*eslint no-eval: "error"*/
/*eslint-env es6*/
var obj = { x: "foo" },
key = "x",
value = obj[key];
class A {
foo() {
// This is a user-defined method.
this.eval("var a = 0");
}
eval() {
}
static {
// This is a user-defined static method.
this.eval("var a = 0");
}
static eval() {
}
}
# 选项
此规则有一个允许间接调用 eval
的选项。对 eval
的间接调用比对 eval
的直接调用更危险,因为它们不能动态更改范围。因此,它们也不会对直接 eval
的性能产生负面影响。
{
"no-eval": ["error", {"allowIndirect": true}] // default is false
}
带有 {"allowIndirect": true}
选项的此规则的错误代码示例:
/*eslint no-eval: "error"*/
var obj = { x: "foo" },
key = "x",
value = eval("obj." + key);
此规则使用 {"allowIndirect": true}
选项的正确代码示例:
/*eslint no-eval: "error"*/
(0, eval)("var a = 0");
var foo = eval;
foo("var a = 0");
this.eval("var a = 0");
/*eslint no-eval: "error"*/
/*eslint-env browser*/
window.eval("var a = 0");
/*eslint no-eval: "error"*/
/*eslint-env node*/
global.eval("var a = 0");
# 已知限制
即使 eval 不是全局的,这条规则也会警告每个 eval()。此行为是为了检测直接 eval 的调用。如:
module.exports = function(eval) { // If the value of this
evalis built-in
evalfunction, this is a // call of direct
eval. eval("var a = 0"); };
此规则无法捕获重命名全局对象。如:
var foo = window; foo.eval("var a = 0");