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"*/
const math = ;
const newMath = ;
const json = ;
const newJSON = ;
const reflect = ;
const newReflect = ;
const atomics = ;
const newAtomics = ;
const intl = ;
const newIntl = ;
此規則的正確程式碼範例
在遊樂場開啟
/*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 中引入。