版本

no-obj-calls

不允許將全域物件屬性作為函式呼叫

建議

設定檔中使用來自 @eslint/jsrecommended 設定會啟用此規則

ECMAScript 提供了幾個全域物件,旨在按原樣使用。其中一些物件看起來好像可以是建構函式,因為它們的開頭字母是大寫(例如 MathJSON),但如果您嘗試將它們作為函式執行,則會拋出錯誤。

ECMAScript 5 規範明確指出 MathJSON 都不能被調用

Math 物件沒有 [[Call]] 內部屬性;不可能將 Math 物件作為函式調用。

ECMAScript 2015 規範明確指出 Reflect 不能被調用

Reflect 物件也沒有 [[Call]] 內部方法;不可能將 Reflect 物件作為函式調用。

ECMAScript 2017 規範明確指出 Atomics 不能被調用

Atomics 物件也沒有 [[Call]] 內部方法;不可能將 Atomics 物件作為函式調用。

而且 ECMAScript 國際化 API 規範明確指出 Intl 不能被調用

Intl 物件也沒有 [[Call]] 內部方法;不可能將 Intl 物件作為函式調用。

規則詳細資訊

此規則不允許將 MathJSONReflectAtomicsIntl 物件作為函式呼叫。

此規則也不允許使用 new 運算子將這些物件作為建構函式使用。

此規則的錯誤程式碼範例

在遊樂場開啟
/*eslint no-obj-calls: "error"*/

const math = Math();

const newMath = new Math();

const json = JSON();

const newJSON = new JSON();

const reflect = Reflect();

const newReflect = new Reflect();

const atomics = Atomics();

const newAtomics = new Atomics();

const intl = Intl();

const newIntl = new Intl();

此規則的正確程式碼範例

在遊樂場開啟
/*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 中引入。

延伸閱讀

資源

變更語言