版本

strict

要求或禁止使用嚴格模式指令

🔧 可修正

此規則回報的一些問題可透過 --fix 命令列選項自動修正

嚴格模式指令是位於腳本或函式主體開頭的 "use strict" 字串常值。它會啟用嚴格模式語意。

當指令出現在全域範圍時,嚴格模式會套用至整個腳本

"use strict";

// strict mode

function foo() {
    // strict mode
}

當指令出現在函式主體開頭時,嚴格模式僅套用至該函式,包括所有包含的函式

function foo() {
    "use strict";
    // strict mode
}

function foo2() {
    // not strict mode
};

(function() {
    "use strict";
    function bar() {
        // strict mode
    }
}());

CommonJS 模組系統中,一個隱藏的函式會包裝每個模組,並限制「全域」嚴格模式指令的範圍。

ECMAScript 模組中,由於它們始終具有嚴格模式語意,因此這些指令是不必要的。

規則詳細資訊

此規則要求或禁止使用嚴格模式指令。

如果 ESLint 設定指定以下任一項作為剖析器選項,則無論指定哪個選項,此規則都會禁止使用嚴格模式指令

  • "sourceType": "module",即檔案為 ECMAScript 模組
  • ecmaFeatures 物件中的 "impliedStrict": true 屬性

無論指定哪個選項,此規則都會禁止在具有非簡單參數列表的函式(例如,具有預設參數值的參數列表)中使用嚴格模式指令,因為在 ECMAScript 2016 及更高版本中,這是一種語法錯誤。請參閱 function 選項的範例。

無論指定哪個選項,此規則都不會套用至類別靜態區塊,因為類別靜態區塊沒有指令。因此,類別靜態區塊中的 "use strict" 陳述式不是指令,且將由no-unused-expressions 規則回報。

命令列上的 --fix 選項不會插入新的 "use strict" 陳述式,而只會移除不需要的陳述式。

選項

此規則具有字串選項

  • "safe" (預設) 對應於以下任一選項
    • 如果 ESLint 認為檔案是 CommonJS 模組,則為 "global"
    • 否則為 "function"
  • "global" 要求在全域範圍中存在一個嚴格模式指令(並禁止任何其他嚴格模式指令)
  • "function" 要求在每個頂層函式宣告或運算式中存在一個嚴格模式指令(並禁止任何其他嚴格模式指令)
  • "never" 禁止使用嚴格模式指令

safe

如果 ESLint 認為檔案是 Node.jsCommonJS 模組,則 "safe" 選項對應於 "global" 選項,因為設定指定以下任一項

否則,"safe" 選項會對應於 "function" 選項。請注意,如果明確在設定中指定 "globalReturn": false,則無論指定的環境為何,"safe" 選項都會對應於 "function" 選項。

global

使用 "global" 選項時,此規則的不正確程式碼範例

在遊樂場中開啟
/*eslint strict: ["error", "global"]*/

function foo() {
}
在遊樂場中開啟
/*eslint strict: ["error", "global"]*/

function foo() {
    "use strict";
}
在遊樂場中開啟
/*eslint strict: ["error", "global"]*/

"use strict";

function foo() {
    "use strict";
}

使用 "global" 選項時,此規則的正確程式碼範例

在遊樂場中開啟
/*eslint strict: ["error", "global"]*/

"use strict";

function foo() {
}

function

此選項確保所有函式主體都是嚴格模式程式碼,而全域程式碼則不是。特別是,如果建置步驟串連多個腳本,則一個腳本的全域程式碼中的嚴格模式指令可能會意外地在另一個不打算成為嚴格程式碼的腳本中啟用嚴格模式。

使用 "function" 選項時,此規則的不正確程式碼範例

在遊樂場中開啟
/*eslint strict: ["error", "function"]*/

"use strict";

function foo() {
}
在遊樂場中開啟
/*eslint strict: ["error", "function"]*/

function foo() {
}

(function() {
    function bar() {
        "use strict";
    }
}());
在遊樂場中開啟
/*eslint strict: ["error", "function"]*/

// Illegal "use strict" directive in function with non-simple parameter list.
// This is a syntax error since ES2016.
function foo(a = 1) {
    "use strict";
}

// We cannot write "use strict" directive in this function.
// So we have to wrap this function with a function with "use strict" directive.
function foo(a = 1) {
}

使用 "function" 選項時,此規則的正確程式碼範例

在遊樂場中開啟
/*eslint strict: ["error", "function"]*/

function foo() {
    "use strict";
}

(function() {
    "use strict";

    function bar() {
    }

    function baz(a = 1) {
    }
}());

var foo = (function() {
    "use strict";

    return function foo(a = 1) {
    };
}());

never

使用 "never" 選項時,此規則的不正確程式碼範例

在遊樂場中開啟
/*eslint strict: ["error", "never"]*/

"use strict";

function foo() {
}
在遊樂場中開啟
/*eslint strict: ["error", "never"]*/

function foo() {
    "use strict";
}

使用 "never" 選項時,此規則的正確程式碼範例

在遊樂場中開啟
/*eslint strict: ["error", "never"]*/

function foo() {
}

先前的預設值 (已移除)

(已移除) 此規則的預設選項(即未指定字串選項)已在 ESLint v1.0 中移除"function" 選項與移除的選項最相似。

此選項可確保所有函式都在嚴格模式下執行。嚴格模式指令必須存在於全域程式碼中,或存在於每個頂層函式宣告或運算式中。它不會關心已嚴格的巢狀函式中不必要的嚴格模式指令,也不會關心同一層級的多個嚴格模式指令。

使用已移除的先前預設選項時,此規則的不正確程式碼範例

// "strict": "error"

function foo() {
}
// "strict": "error"

(function() {
    function bar() {
        "use strict";
    }
}());

使用已移除的先前預設選項時,此規則的正確程式碼範例

// "strict": "error"

"use strict";

function foo() {
}
// "strict": "error"

function foo() {
    "use strict";
}
// "strict": "error"

(function() {
    "use strict";
    function bar() {
        "use strict";
    }
}());

何時不該使用

在同時具有嚴格和非嚴格程式碼的程式碼庫中,請關閉此規則,或在必要時選擇性地停用它。例如,在嚴格模式下,參考 arguments.callee 的函式是無效的。MDN 上提供了嚴格模式差異的完整列表

版本

此規則是在 ESLint v0.1.0 中引入的。

資源

變更語言