严格模式直接禁止未声明变量赋值,使隐式全局变量行为抛出ReferenceError而非静默挂载到全局对象,强制显式声明(let/const/var),配合ES6模块默认启用机制,从源头杜绝拼写错误、变量污染等隐患。

严格模式直接禁止未声明变量的赋值操作,让原本“悄悄挂到全局对象上”的行为变成明确报错,从而在开发阶段就暴露拼写错误、遗漏声明等常见问题。
隐式全局变量在非严格模式下的危险表现
非严格模式下,任何未用 let、const 或 var 声明就直接赋值的变量,都会自动成为全局对象(如 window 或 global)的属性:
-
userName = "Alice";→ 静默创建window.userName -
counter++;(counter未声明)→ 创建并递增window.counter - 函数内写错变量名:
userNmae = "Bob";(Nmae拼错)→ 创建意外全局变量,原意变量却仍是undefined
严格模式如何切断这条隐式路径
只要启用 "use strict",上述所有情况都会立即抛出 ReferenceError,而不是容忍执行:
-
"use strict"; userName = "Alice";→Uncaught ReferenceError: userName is not defined - 函数内部同样生效:
function fn() { "use strict"; tempVal = 42; }→ 报错,不污染外层或全局 - 强制你显式声明:
let userName = "Alice";或const tempVal = 42;
为什么这能避免真实 bug
这类错误往往不会立刻崩溃,但会引发难以追踪的问题:
- 两个模块各自误写
dataList为dateList,结果都往同一个意外全局变量写入,互相覆盖 - 测试环境全局变量少,bug 不显现;上线后因其他脚本污染了同名变量,逻辑错乱
- 调试时发现变量值“莫名变化”,花大量时间排查作用域,实际只是拼写错误漏声明
配合现代声明方式效果更稳
严格模式本身不规定用哪种声明关键字,但它与 let/const 天然契合:
-
var仍允许变量提升和函数作用域,容易混淆;而let/const是块级作用域、不提升,配合严格模式能彻底杜绝隐式全局 - ES6 模块(
.mjs或通过import加载的脚本)默认启用严格模式,无需手动加"use strict",进一步降低遗漏风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











