# 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 thiseval- is built-ineval- function, this is a // call of directeval- . eval("var a = 0"); };
- 此规则无法捕获重命名全局对象。如:- var foo = window; foo.eval("var a = 0");
