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