Skip to content

ReferenceError:初始化前无法访问

错误信息

                Cannot access 'x' before initialization
              

快速摘要

你在 `let`/`const` 声明之前就用了这个变量——JS 引擎知道它存在(提升)但还不允许访问。

为什么发生

  • letconst 声明行之前使用了该变量

  • 暂存死区(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)。前者是"没声明",后者是"声明了但太早用"。

相关资源

相关课程

相关练习

← 返回语言