严格模式是JavaScript的限制性变体,启用后使“能跑但不对”的代码直接报错;需置于脚本或函数体第一行(仅允许前置注释或空行),模块默认启用;禁用未声明变量、只读属性赋值、delete不可配置属性、重复参数、八进制字面量;this在全局函数中为undefined而非window,提升可靠性。

JavaScript 严格模式不是新语言,而是对 JavaScript 解析和执行的限制性变体——启用后,原本“能跑但不对”的代码会直接报错,帮你提前暴露隐患。
如何启用严格模式?"use strict" 放哪儿才生效?
必须是脚本或函数体内的**第一行可执行语句**(前面只能有注释或空行),否则无效:
"use strict";
function foo() {
// ✅ 全局严格模式
}
或只在函数内启用:
function bar() {
"use strict";
// ✅ 仅此函数内启用
}
- 如果写在
if块、循环里,或前面有变量声明(如var x = 1; "use strict";),会被忽略 - 模块(
.mjs或import加载的脚本)默认就是严格模式,无需手动加 - 箭头函数不支持单独启用严格模式,它继承外层作用域的严格状态
哪些常见写法在严格模式下会直接报错?
严格模式禁用大量“宽松历史遗留行为”,典型报错包括:
立即学习“Java免费学习笔记(深入)”;
-
ReferenceError:使用未声明变量,如foo = 123;(非严格下会自动挂到window) -
SyntaxError:给只读属性赋值,如Object.defineProperty(obj, "x", {writable: false}); obj.x = 1; -
SyntaxError:删除不可配置属性,如delete Object.prototype.toString; -
TypeError:函数参数名重复,如function f(a, a) {} -
TypeError:八进制字面量(010),必须写成0o10或0x10
严格模式下 this 的行为为什么更可靠?
非严格模式中,全局函数调用时 this 指向 window(浏览器)或 global(Node.js),容易引发隐式绑定错误;严格模式下统一为 undefined:
function test() {
"use strict";
console.log(this); // undefined,而非 window
}
test(); // ✅ 明确提示你可能漏了绑定
- 避免意外污染全局对象
- 让
call/apply/bind和箭头函数的this行为更可预测 - 类方法中若忘记绑定,直接报错而非静默失败
严格模式真正的价值不在“多报几个错”,而在于它强制你面对 JavaScript 中那些模糊、易错、跨环境不一致的边界情况——比如 with 被完全禁用,arguments.callee 不可用,这些都不是“少用就好”,而是从语法层就切断歧义路径。实际项目中,建议所有新文件默认启用,老代码迁移时重点检查动态赋值、eval 使用和 this 绑定逻辑。











