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"
。
- 如果 ESLint 认为文件为 CommonJS 模块,则为
"global"
要求在全局作用域中使用一个严格模式指令(并禁止任何其他严格模式指令)。"function"
要求在每个顶级函数声明或表达式中使用一个严格模式指令(并禁止任何其他严格模式指令)。"never"
禁止使用严格模式指令。
safe
如果 ESLint 认为文件为 Node.js 或 CommonJS 模块(因为配置指定了以下任一项),则 "safe"
选项对应于 "global"
选项。
- 解析器选项 的
ecmaFeatures
对象中的"globalReturn": true
属性。
否则,"safe"
选项对应于 "function"
选项。请注意,如果在配置中显式指定了 "globalReturn": false
,则无论指定的环境如何,"safe"
选项都将对应于 "function"
选项。
global
使用 "global"
选项时,此规则的 不正确 代码示例。
/*eslint strict: ["error", "global"]*/
/*eslint strict: ["error", "global"]*/
/*eslint strict: ["error", "global"]*/
"use strict";
function foo() {
}
使用 "global"
选项时,此规则的 正确 代码示例。
/*eslint strict: ["error", "global"]*/
"use strict";
function foo() {
}
function
此选项确保所有函数体都是严格模式代码,而全局代码则不是。特别是如果构建步骤连接多个脚本,则一个脚本的全局代码中的严格模式指令可能会意外地在另一个不打算为严格代码的脚本中启用严格模式。
使用 "function"
选项时,此规则的 不正确 代码示例。
/*eslint strict: ["error", "function"]*/
/*eslint strict: ["error", "function"]*/
(());
/*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) {
}
// We cannot write "use strict" directive in this function.
// So we have to wrap this function with a function with "use strict" directive.
使用 "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"]*/
function foo() {
}
/*eslint strict: ["error", "never"]*/
function foo() {
}
使用 "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 中引入的。