版本

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 运算符一起用作构造函数。

此规则的错误代码示例

在 Playground 中打开
/*eslint no-obj-calls: "error"*/

const math = Math();

const newMath = new Math();

const json = JSON();

const newJSON = new JSON();

const reflect = Reflect();

const newReflect = new Reflect();

const atomics = Atomics();

const newAtomics = new Atomics();

const intl = Intl();

const newIntl = new Intl();

此规则的正确代码示例

在 Playground 中打开
/*eslint no-obj-calls: "error"*/

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

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

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

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

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

由 TypeScript 处理

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

版本

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

延伸阅读

资源

更改语言