# no-obj-calls
禁止将全局对象属性作为函数调用
配置文件中的 "extends": "eslint:recommended" 属性启用了该规则
ECMAScript 提供了几个旨在按原样使用的全局对象。其中一些对象看起来好像是构造函数,因为它们的大小写(例如 Math
和 JSON
),但如果您尝试将它们作为函数执行,则会引发错误。
ECMAScript 5 规范
明确表示不能调用 Math
和 JSON
:
Math 对象没有 [[Call]] 内部属性;不能将 Math 对象作为函数调用。
ECMAScript 2015 规范
明确表示不能调用 Reflect
:
Reflect 对象也没有 [[Call]] 内部方法;不能将 Reflect 对象作为函数调用。
并且 ECMAScript 2017 规范
明确表示不能调用 Atomics
:
Atomics 对象没有 [[Call]] 内部方法;不能将 Atomics 对象作为函数调用。
# 规则详情
此规则不允许将 Math
、JSON
、Reflect
和 Atomics
对象作为函数调用。
此规则还禁止将这些对象用作带有 new
运算符的构造函数。
此规则的错误代码示例:
/*eslint no-obj-calls: "error"*/
/*eslint-env es2017*/
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();
此规则的正确代码示例:
/*eslint no-obj-calls: "error"*/
/*eslint-env es2017*/
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);