no-obj-calls
禁止将全局对象属性作为函数调用
✅ 推荐
在配置文件中使用来自 @eslint/js
的 recommended
配置启用此规则
ECMAScript 提供了几个全局对象,旨在按原样使用。其中一些对象看起来好像可以是构造函数,因为它们的首字母大写(例如 Math
和 JSON
),但如果您尝试将它们作为函数执行,则会抛出错误。
ECMAScript 5 规范明确指出 Math
和 JSON
都不能被调用
Math 对象没有
[[Call]]
内部属性;不可能将 Math 对象作为函数调用。
ECMAScript 2015 规范明确指出 Reflect
不能被调用
Reflect 对象也没有
[[Call]]
内部方法;不可能将 Reflect 对象作为函数调用。
ECMAScript 2017 规范明确指出 Atomics
不能被调用
Atomics 对象也没有
[[Call]]
内部方法;不可能将 Atomics 对象作为函数调用。
并且 ECMAScript 国际化 API 规范明确指出 Intl
不能被调用
Intl 对象没有
[[Call]]
内部方法;不可能将 Intl 对象作为函数调用。
规则详情
此规则禁止将 Math
、JSON
、Reflect
、Atomics
和 Intl
对象作为函数调用。
此规则还禁止将这些对象与 new
运算符一起用作构造函数。
此规则的错误代码示例
在 Playground 中打开
/*eslint no-obj-calls: "error"*/
const math = ;
const newMath = ;
const json = ;
const newJSON = ;
const reflect = ;
const newReflect = ;
const atomics = ;
const newAtomics = ;
const intl = ;
const newIntl = ;
此规则的正确代码示例
在 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 中引入。