严格模式通过"use strict"启用,禁止隐式创建全局变量、使未声明变量赋值报referenceerror、普通函数中this为undefined、禁用八进制字面量等歧义语法,并约束eval和arguments行为。

在严格模式下,JavaScript 会直接阻止隐式全局变量的创建——只要没用 let、const 或 var 显式声明就赋值,就会立即抛出 ReferenceError,而不是悄悄挂到 window 或 globalThis 上。这是最核心的防护机制。
启用严格模式是前提
必须在脚本顶部或函数体开头写上:
-
"use strict";(注意是字符串字面量,带引号) - ES 模块(
.mjs文件或<script type="module"></script>)默认启用严格模式,无需手动加 - 单独函数内启用也有效:
function foo() { "use strict"; x = 10; }—— 此时x = 10会报错
声明变量必须显式使用关键字
严格模式不改变语法,但会拒绝“裸赋值”。以下写法在非严格模式下创建全局变量,在严格模式下全部报错:
-
count = 5;→ReferenceError: count is not defined -
user.name = "Alice";(若user未定义)→ 同样报错,不会自动创建window.user -
this.value = 100;(在普通函数中调用且未绑定对象)→this是undefined,赋值失败并报错
配合现代写法加固隔离
光靠严格模式还不够,需结合编码习惯:
- 优先用
const和let,避免var的变量提升和作用域模糊问题 - 模块化开发:用
import/export替代多个<script></script>标签直连,天然隔离顶层作用域 - 避免给
window或globalThis手动挂属性,如window.api = {...};如需暴露接口,统一收敛到一个命名空间对象 - 老项目无模块支持时,可用 IIFE 封装:
(function() { "use strict"; /* 私有逻辑 */ })();
辅助工具提前拦截
严格模式报错发生在运行时,但开发阶段可借助工具预防:
- ESLint 配置
no-implicit-globals和no-unused-vars规则,未声明就使用的变量会在编辑器里标红 - TypeScript 编译期检查能更早发现未声明变量,且强制类型与作用域约束
- 构建工具(如 Vite、Webpack)开启严格模式提示或自动注入
"use strict"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











