严格模式下未声明变量直接赋值或读取会立即报ReferenceError,因引擎禁止隐式创建全局变量,强制变量先声明后使用。

严格模式下变量声明报错,核心原因是“未声明就使用”被引擎直接拦截,不再静默创建全局变量,而是抛出 ReferenceError。这不是运行时逻辑错误,而是执行前就被拒绝的语法级约束。
哪些写法会立刻报错
以下代码只要启用了严格模式(脚本顶部或函数首行有 "use strict";),就会在执行到那一行时中断并报错:
-
userName = "Alice";—— 没用let、const或var声明,直接赋值 -
console.log(count);—— 变量从未声明,也未初始化,直接读取 -
function test(a, a) { }—— 参数名重复,触发 SyntaxError(解析阶段就失败) -
let x; console.log(x.toString());—— 虽然声明了,但x是undefined,调用方法时报 TypeError(这不属于声明错误,但常因未初始化引发)
为什么非严格模式不报错,而严格模式会
非严格模式下,score = 95; 这样的语句会被解释为:如果当前作用域找不到 score,就在全局对象(如 window)上创建一个同名属性。这种隐式挂载容易掩盖拼写错误或作用域误用。
严格模式废除了这个“容错机制”。它把“变量必须先声明再使用”变成一条硬性规则,让问题暴露得更早、更明确。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
如何快速定位报错位置
浏览器控制台显示的错误信息非常直接:
Uncaught ReferenceError: userName is not defined看到这类提示,就说明你在某处用了 userName,但它既没被 let、const 声明过,也不在当前作用域链中可访问。重点检查:
- 拼写是否一致(
userName≠username) - 是否在
if或for块内声明,却在块外使用 - 是否忘记写声明关键字,比如写了
data = fetchResult;而不是const data = fetchResult;
怎么避免这类报错
养成三个习惯就能大幅减少声明类错误:
- 所有新变量一律以
const开头;只有确认要重新赋值时,才改用let;彻底不用var - 声明和初始化写在同一行,比如
const API_URL = "https://api.example.com";,不写let config;留空 - 借助 ESLint 配置
"no-undef": "error"规则,保存代码时就能高亮未声明变量

















