Versions

no-new-func

Disallow new operators with the Function object

在 JavaScript 中,可以在运行时使用 Function 构造函数从字符串中创建函数,例如:

var x = new Function("a", "b", "return a + b");
var x = Function("a", "b", "return a + b");
var x = Function.call(null, "a", "b", "return a + b");
var x = Function.apply(null, ["a", "b", "return a + b"]);
var x = Function.bind(null, "a", "b", "return a + b")();

许多人这个写法很糟糕,因为很难调试和阅读这些类型的函数。此外,内容安全政策(CSP)指令可能不允许使用 eval() 和类似的方法来从字符串中创建代码。

规则细节

提出这个错误是为了强调使用了一个不好的做法。通过向 Function 构造函数传递一个字符串,你要求引擎以调用 eval 函数的方式来解析这个字符串。

使用此规则的错误示例:

Open in Playground
/*eslint no-new-func: "error"*/

var x = new Function("a", "b", "return a + b");
var x = Function("a", "b", "return a + b");
var x = Function.call(null, "a", "b", "return a + b");
var x = Function.apply(null, ["a", "b", "return a + b"]);
var x = Function.bind(null, "a", "b", "return a + b")();
var f = Function.bind(null, "a", "b", "return a + b"); // assuming that the result of Function.bind(...) will be eventually called.

使用此规则的正确示例:

Open in Playground
/*eslint no-new-func: "error"*/

var x = function (a, b) {
    return a + b;
};

何时不用

在更高级的情况下,你确实需要使用 Function 构造函数。

Version

This rule was introduced in ESLint v0.0.7.

Resources

更改语言