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
运算符将这些对象用作构造函数。
此规则的 不正确 代码示例
在游乐场中打开
/*eslint no-obj-calls: "error"*/
var math = ;
var newMath = ;
var json = ;
var newJSON = ;
var reflect = ;
var newReflect = ;
var atomics = ;
var newAtomics = ;
var intl = ;
var newIntl = ;
此规则的 正确 代码示例
在游乐场中打开
/*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 中引入。