ReferenceError:初始化前无法访问
错误信息
Cannot access 'x' before initialization
快速摘要
你在 `let`/`const` 声明之前就用了这个变量——JS 引擎知道它存在(提升)但还不允许访问。
为什么发生
在
let或const声明行之前使用了该变量暂存死区(TDZ)——变量已被提升,但在声明行之前尚未初始化
代码被重排,导致使用处现在排到了声明之前
最小示例
✗ 错误代码
console.log(name);
const name = "Alice";✓ 修复代码
const name = "Alice";
console.log(name);const name 虽然被提升,但在声明行之前处于暂存死区——此时访问会抛 ReferenceError。先声明再使用即可。
如何诊断
找到该变量的声明行——它是否在用法之后?
理解
let/const会被提升,但在声明行之前处于 TDZ,不可访问检查代码是否被移动或重排到了别的函数中
如何修复
把声明移到第一次使用该变量之前
重构代码,让变量在需要时已经初始化
仅在清楚提升差异时才改用
var(不推荐)
如何预防
在作用域顶部声明变量
一致使用
const/let,并启用 ESLint 相关规则
常见混淆
容易混淆的错误: ReferenceError: x is not defined(变量未声明)
关键区别:
is not defined指变量从未用 let/const/var 声明过;Cannot access before initialization指变量已用 let/const 声明,但在声明行之前被访问(TDZ)。前者是"没声明",后者是"声明了但太早用"。
相关资源
相关课程
- JavaScript 变量
了解变量提升与暂存死区(TDZ)
相关练习
- let 与 const 测验
考察你对 let/const 行为的理解。
- 预测变量重新赋值
预测变量重新赋值后的行为。