严格模式通过禁止未声明变量赋值直接报错(如count = 10抛出ReferenceError)来杜绝隐式全局变量,强制使用let/const/var显式声明,同时限制eval污染全局、禁止修改不可配置属性,从而保护全局对象完整性。

严格模式通过“不给机会”的方式限制全局作用域生成变量,核心是让未声明赋值直接失败,而不是悄悄挂到全局对象上。
禁止隐式全局变量
非严格模式下,写 count = 10 会自动把 count 挂到 window.count(浏览器)或 globalThis.count(Node.js)上,污染全局空间。严格模式下,这行代码执行时立刻抛出 ReferenceError: count is not defined,变量根本不会出现。
- 所有新变量必须用
let、const或var显式声明 -
user.name = "Tom"是允许的——前提是user已声明且可写 -
score = 95(score未声明)——严格模式下必定报错
限制 eval 创建全局变量
正常模式中,eval('var x = 1') 会让 x 成为全局变量;严格模式下,eval 拥有独立作用域,里面声明的变量只在 eval 内部有效。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
"use strict"; eval('var x = 1'); console.log(x);→ 报错:x is not defined - 这个机制避免了动态代码意外泄漏到全局
不自动扩展全局对象
严格模式下,对只读属性赋值、删除不可配置属性、给不可扩展对象添加新属性等操作都会立即报 TypeError,防止意外修改全局对象行为。
立即学习“Java免费学习笔记(深入)”;
-
"use strict"; delete Object.prototype.toString;→ 报错 -
"use strict"; Object.freeze({}).newProp = 1;→ 报错 - 这些限制间接保护了
window、globalThis等全局对象的完整性
启用方式影响作用域范围
严格模式本身不创建新作用域,但它的生效范围决定了哪些代码受约束:
- 脚本级:
"use strict"放在文件最开头,整份脚本受控 - 函数级:
"use strict"在函数体第一行,仅该函数内生效 - ESM 模块(.mjs 或
type="module")默认严格,顶层const/let不挂全局 - 注意拼接风险:多个脚本合并时,一个文件的全局
"use strict"可能“传染”到其他文件

















