严格模式通过显式报错暴露隐患:未声明变量赋值、undefined调用方法、重复参数名、只读属性赋值、with语句均抛出错误;需用"use strict"双引号置于顶部或函数首行启用。
JavaScript 严格模式("use strict")不是一种新语言,而是一套更严格的语法和错误检查规则——它不会修复你的代码,但会把原本静默失败的问题变成明确报错,帮你提前发现隐患。
不加 "use strict" 时,很多错误被忽略或自动“修复”,比如给未声明变量赋值会意外创建全局变量;而开启后,这类操作直接抛出 ReferenceError。
undefined 上调用方法(如 foo.bar(),其中 foo 是 undefined)→ 报 TypeError,而不是静默返回 undefined
function f(a, a) { })→ 报 SyntaxError(仅在函数顶部启用时生效)Object.defineProperty(obj, 'x', { value: 1, writable: false }) 后再写 obj.x = 2)→ 报 TypeError
with 语句 → 报 SyntaxError(该语句本身已废弃且极易引发作用域混乱)必须是字面量字符串 "use strict",且必须出现在脚本顶部或函数体第一行(前面不能有其他语句,包括注释也不行);否则无效。
"use strict"; x = 3.14; // ReferenceError: x is not defined
function doSomething() {
"use strict";
y = 42; // ReferenceError
}.mjs 或 type="module" 的 script)默认就是严格模式,无需手动加'use strict'(单引号)——虽然大多数引擎也认,但规范要求双引号,为兼容性建议统一用双引号它不只是“报错更多”,还移除了某些容易误用的特性,让行为更可预测:
this 在非对象上下文中不再绑定到全局对象(如普通函数调用中 this 是 undefined,而非 window 或 globalThis)arguments 不再与命名参数保持别名同步(修改 arguments[0] 不再影响形参变量)010),改用 0o10;否则报
SyntaxError
eval 不能在当前作用域声明变量或函数(避免污染外层作用域)真正关键的不是“要不要开”,而是理解哪些错误被暴露了——比如你依赖 with 或静默创建全局变量,那开启后必然崩;这时候该重构代码,而不是关掉 strict mode。