版本

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 中引入的。

进一步阅读

资源

更改语言