严格模式通过抛出ReferenceError阻止未声明变量赋值,暴露意外全局变量问题;需配合let/const显式声明或挂载globalThis来真正规范全局变量。

在 JavaScript 中,严格模式(Strict Mode)本身不能强制规范全局变量声明,但它能帮你暴露未声明就赋值的全局变量问题——这类操作在非严格模式下会静默创建全局变量,而在严格模式下直接抛出 ReferenceError,从而倒逼你显式声明。
严格模式如何拦截“意外全局变量”
非严格模式下,以下代码不会报错,但会在全局对象(如 window 或 globalThis)上悄悄创建一个全局变量:
开启严格模式后,同一行会立即报错:
'use strict';x = 42; // Uncaught ReferenceError: x is not defined
这让你无法绕过声明直接赋值,相当于“用报错代替容忍”,是规范全局变量的第一道防线。
立即学习“Java免费学习笔记(深入)”;
必须配合显式声明语法才真正规范
严格模式只是报错,不自动帮你声明。要真正规范全局变量,需主动选择合适的方式:
- 避免全局变量优先:把变量放在函数、模块或块级作用域内,减少全局污染
-
若必须全局,显式挂载到
globalThis(推荐):
globalThis.API_BASE_URL = 'https://api.example.com'; -
旧环境可用
window或global(注意兼容性):
window.DEBUG = true; -
不用
var声明全局变量:它会提升且可能被重复声明,易引发混乱;let/const在顶层作用域声明的变量不会成为全局对象属性(ES6+ 模块中尤其明显)
模块脚本天然启用严格模式
使用 <script type="module"></script> 的脚本,无需手动写 'use strict';,自动启用严格模式,且顶层 let/const/class 声明不会添加到全局对象,更利于控制作用域。
检查是否已启用严格模式的小技巧
可在任意作用域中快速验证:
function isStrict() {return this === undefined;
}
console.log(isStrict()); // true 表示严格模式生效
不复杂但容易忽略:严格模式不是“自动声明工具”,而是“错误放大器”。真正规范全局变量,靠的是开启严格模式 + 主动声明 + 明确挂载目标。


















