严格模式通过禁止隐式全局变量赋值来防护全局污染,要求显式声明变量,未声明即赋值会抛出ReferenceError;需在脚本顶部或函数开头添加"use strict"启用,ESM默认启用。

严格模式下,JavaScript 会直接阻止隐式全局变量的产生——只要没用 let、const 或 var 声明就赋值,就会立即抛出 ReferenceError,而不是悄悄挂到 window 或 globalThis 上。这是它最直接、最有效的防护机制。
启用严格模式是前提
必须在脚本顶部或函数体开头加上:"use strict";
现代模块(ESM)默认启用,但传统 <script> 标签或 CommonJS 模块需手动添加。只写在函数内时,仅该函数受约束;写在全局作用域,则整个脚本生效。
声明变量必须显式使用关键字
以下写法在严格模式中全部报错:
-
count = 10;→ReferenceError: count is not defined -
user.name = "Tom";(若user未声明)→ 同样报错 -
this.value = 42;(在普通函数中调用且this为undefined)→TypeError: Cannot set property 'value' of undefined
正确做法始终是:
-
let count = 10;(推荐,块级作用域) const user = { name: "Tom" };-
var oldStyle = "ok";(不推荐,但合法)
警惕看似局部、实则全局的陷阱
有些操作表面看没碰全局,实际仍可能泄漏:
立即学习“Java免费学习笔记(深入)”;
-
obj.prop = value前未检查obj是否已定义 → 报错,但若漏掉严格模式就成隐式全局 -
function f() { x = 5; }→ 严格模式下进函数就崩,不会等到执行 -
with和eval被禁用,避免动态作用域导致的不可控绑定
这些限制不是为了刁难,而是把“侥幸通过”的路径彻底堵死,让问题在开发阶段就暴露。
配合函数封装和模块化更稳妥
严格模式解决的是“误写即污染”,但主动设计更能防患于未然:
- 用 IIFE 包裹旧脚本:
(function() { "use strict"; /* 代码 */ })(); - ESM 中天然严格,且顶层
const/let不挂全局,比var安全得多 - 导出最小接口,内部变量完全隔离,比如:
export const api = { fetch() { ... } };
不复杂但容易忽略:严格模式本身不创造作用域,它只是给变量声明加了一道“安检门”。真正守住全局空间,靠的是“每次赋值前先想清楚怎么声明”。


















