严格模式通过显式报错暴露隐患:未声明变量赋值、undefined调用方法、重复参数名、只读属性赋值、with语句均抛出错误;需用"use strict"双引号置于顶部或函数首行启用。

JavaScript 严格模式("use strict")不是一种新语言,而是一套更严格的语法和错误检查规则——它不会修复你的代码,但会把原本静默失败的问题变成明确报错,帮你提前发现隐患。
strict mode 下哪些错误会被显式抛出
不加 "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(该语句本身已废弃且极易引发作用域混乱)
如何正确启用 strict mode
必须是字面量字符串 "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'(单引号)——虽然大多数引擎也认,但规范要求双引号,为兼容性建议统一用双引号
严格模式禁用或改变的行为
它不只是“报错更多”,还移除了某些容易误用的特性,让行为更可预测:
立即学习“Java免费学习笔记(深入)”;
-
this在非对象上下文中不再绑定到全局对象(如普通函数调用中this是undefined,而非window或globalThis) -
arguments不再与命名参数保持别名同步(修改arguments[0]不再影响形参变量) - 禁止八进制字面量(如
010),改用0o10;否则报SyntaxError -
eval不能在当前作用域声明变量或函数(避免污染外层作用域)
真正关键的不是“要不要开”,而是理解哪些错误被暴露了——比如你依赖 with 或静默创建全局变量,那开启后必然崩;这时候该重构代码,而不是关掉 strict mode。











