严格模式下未声明变量赋值会抛出ReferenceError,应使用let/const显式声明变量,避免var;模块作用域默认严格模式,可防止全局污染。

在严格模式下,直接给未声明的变量赋值会抛出 ReferenceError,这是设计用来防止意外创建全局变量的保护机制。规避的关键不是“绕过”这个错误,而是**主动声明变量**,让赋值行为合法合规。
明确使用 let 或 const 声明变量
这是最直接、最推荐的做法。严格模式要求所有变量必须显式声明,不能隐式挂载到全局对象上。
- 用
let声明块级作用域变量(适合可能重新赋值的场景) - 用
const声明常量(适合初始化后不再改变的值,注意:对象/数组本身可修改,只是绑定不可变) - 避免使用
var,它存在变量提升和函数作用域问题,容易引发混淆
确认变量作用域,避免跨作用域误用
常见错误是:在函数内部想修改外层变量,却忘了外层已声明,或误以为能自动访问父作用域未声明的标识符。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 检查变量是否已在当前作用域链中正确定义(比如外层函数或模块顶层)
- 如果需要在嵌套函数中修改外层变量,确保该变量已在上层用
let/const声明 - 不要依赖“自动创建全局变量”的旧习惯,例如
myVar = 42在严格模式下一定报错
利用模块作用域替代全局污染
现代 JavaScript 项目普遍使用 ES 模块(.mjs 或 type="module" 的 script),其顶层作用域本就是模块作用域,而非全局作用域。
立即学习“Java免费学习笔记(深入)”;
- 在模块中直接写
let count = 0,不会污染window(浏览器)或global(Node.js) - 如需共享数据,显式导出:
export let config = { ... }; - 模块内不加
"use strict"也默认启用严格模式
调试时快速定位未声明变量
当遇到 Uncaught ReferenceError: xxx is not defined,可按以下步骤排查:
- 查看报错行号,确认赋值操作左侧是否拼写错误(如
userNmae = "Alice") - 检查是否漏掉了
let/const(如写了message = "hello"却没声明) - 确认代码是否运行在严格模式下(脚本顶部有
"use strict",或属于模块/类/箭头函数等默认严格上下文)

















