版本

no-obj-calls

禁止将全局对象属性作为函数调用

推荐

配置文件 中使用来自 @eslint/jsrecommended 配置将启用此规则

ECMAScript 提供了一些旨在直接使用的全局对象。其中一些对象看起来像是构造函数,因为它们以大写字母开头(例如 MathJSON),但如果您尝试将它们作为函数执行,则会引发错误。

ECMAScript 5 规范 明确指出 MathJSON 无法调用

Math 对象没有 [[Call]] 内部属性;无法将 Math 对象作为函数调用。

ECMAScript 2015 规范 明确指出 Reflect 无法调用

Reflect 对象也没有 [[Call]] 内部方法;无法将 Reflect 对象作为函数调用。

ECMAScript 2017 规范 明确指出 Atomics 无法调用

Atomics 对象没有 [[Call]] 内部方法;无法将 Atomics 对象作为函数调用。

以及 ECMAScript 国际化 API 规范 明确指出 Intl 无法调用

Intl 对象没有 [[Call]] 内部方法;无法将 Intl 对象作为函数调用。

规则详细信息

此规则禁止将 MathJSONReflectAtomicsIntl 对象作为函数调用。

此规则还禁止使用 new 运算符将这些对象用作构造函数。

此规则的 不正确 代码示例

在游乐场中打开
/*eslint no-obj-calls: "error"*/

var math = Math();

var newMath = new Math();

var json = JSON();

var newJSON = new JSON();

var reflect = Reflect();

var newReflect = new Reflect();

var atomics = Atomics();

var newAtomics = new Atomics();

var intl = Intl();

var newIntl = new Intl();

此规则的 正确 代码示例

在游乐场中打开
/*eslint no-obj-calls: "error"*/

function area(r) {
    return Math.PI * r * r;
}

var object = JSON.parse("{}");

var value = Reflect.get({ x: 1, y: 2 }, "x");

var first = Atomics.load(foo, 0);

var segmenterFr = new Intl.Segmenter("fr", { granularity: "word" });

由 TypeScript 处理

在使用 TypeScript 时,禁用此规则是安全的,因为 TypeScript 的编译器会强制执行此检查。

版本

此规则在 ESLint v0.0.9 中引入。

进一步阅读

资源

更改语言