启用严格模式能立即报错未声明赋值行为,堵住隐式全局变量:整脚本在首行加"use strict",或函数体首行添加;它使拼错变量名、漏声明循环变量等均抛ReferenceError,配合let/const更安全。

直接在脚本或函数顶部加 "use strict",就能让未声明就赋值的行为立刻报错,而不是悄悄挂到 window 或 globalThis 上——这是堵住隐式全局变量最有效的方式。
怎么启用严格模式
有两种常用方式,选一种即可:
-
整个脚本启用:把
"use strict";放在 JS 文件第一行(或<script></script>标签内首行),后面所有代码都受约束 -
单个函数启用:在函数体第一行写
"use strict";,只对该函数生效,不影响外部或其他函数
注意:"use strict" 必须紧贴顶部,前面不能有空行、注释或任何语句,否则无效。
它怎么阻止隐式全局变量
非严格模式下,userName = "Alice" 或 counter++(counter 没声明)会静默创建全局变量;严格模式下,这些操作全部抛出 ReferenceError:
立即学习“Java免费学习笔记(深入)”;
- 拼错变量名(比如把
userName写成userNmae)也会报错,不会意外生成新全局变量 - 函数内部漏声明变量(如
for (i = 0; i )同样中断执行,逼你写成 <code>for (let i = 0; ...) - 即使嵌套函数、回调、定时器里的代码,只要所在作用域启用了严格模式,就一视同仁
配合现代声明习惯效果更好
严格模式本身不限制用哪种关键字,但和 let/const 搭配才真正安全:
-
let和const是块级作用域、不提升,避免变量被意外读取或覆盖 -
var虽仍可用,但存在变量提升和函数作用域问题,容易混淆,不推荐作为首选 - ES6 模块(
.mjs或type="module"的 script)默认启用严格模式,无需手动添加
为什么这能避免真实 bug
隐式全局变量的问题往往延迟暴露:
- 两个模块都把
dataList拼错成dateList,结果往同一个意外全局变量里写,互相覆盖 - 本地测试时全局变量少,逻辑正常;上线后其他脚本污染了同名变量,行为突然异常
- 调试时发现值“莫名变化”,花半天查作用域,最后发现只是漏写了
let
严格模式把这些隐患卡在运行前,让错误显性化、可定位。


















