严格模式通过"use strict"启用,禁用with、重复参数等隐患语法,并使全局this为undefined、arguments与参数解耦,提升代码健壮性。

JavaScript 严格模式不是“新语言”,而是一组更严格的语法和错误检查规则;启用后,原本能运行但存在隐患的代码会直接报错,比如给未声明变量赋值、重复参数名、使用保留字作标识符等。
如何启用严格模式
严格模式必须通过 "use strict" 指令显式开启,且只能出现在脚本顶部或函数体开头(不能在条件语句或循环内):
"use strict";
function foo() {
"use strict"; // 函数级严格模式
x = 1; // ReferenceError: x is not defined
}
- 全局启用:整个脚本第一行是
"use strict"(注意必须是字符串字面量,不能带变量或表达式) - 函数级启用:仅对该函数及其嵌套函数生效,不影响外部作用域
- 模块(
.mjs或import加载的脚本)默认启用严格模式,无需手动写"use strict" - 箭头函数不能单独开启严格模式,它继承外层作用域的严格状态
严格模式下哪些常见操作会报错
它不改变语言能力,但让隐式错误显性化。以下代码在非严格模式下静默失败或产生意外行为,在严格模式下直接抛异常:
-
with语句被完全禁止 ——with ({x: 1}) { console.log(x); }→SyntaxError - 函数参数名重复 ——
function f(a, a) { }→SyntaxError - 给只读属性赋值 ——
Object.defineProperty(obj, 'x', {value: 1, writable: false}); obj.x = 2;→TypeError - 删除不可配置属性 ——
delete Object.prototype.toString;→TypeError - 八进制字面量(如
010)被禁用(ES5 严格模式),ES6+ 中0o10是合法的,不受影响
严格模式对 this 和 arguments 的影响
这是最容易被忽略的兼容性差异点:
立即学习“Java免费学习笔记(深入)”;
- 全局函数调用时,
this不再指向window(浏览器)或global(Node.js),而是undefined:function f() { return this; }; f();→ 非严格返回window,严格返回undefined -
arguments不再与命名参数保持“双向绑定”:function f(a) { a = 2; return arguments[0]; }→ 非严格返回2,严格返回undefined(因为arguments是独立快照) -
eval在严格模式下不引入新变量到外层作用域,且无法访问外层变量(除非显式传入)
严格模式真正的价值不在“多报几个错”,而在于提前暴露那些依赖引擎容错机制的脆弱逻辑。尤其在大型项目中,它能让 undefined 变量、意外全局泄漏、this 绑定混乱等问题在开发阶段就浮现出来,而不是等到线上出 bug 才发现。











