版本

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"*/

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();

var intl = Intl();

var newIntl = new Intl();

此規則的正確程式碼範例

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

延伸閱讀

資源

變更語言