You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段JavaScript代码抛出Uncaught ReferenceError?预期输出应为10 22

为什么这段JavaScript代码会抛出ReferenceError?

先看你写的代码:

let y = 10; 
{ 
  console.log(y); // 此行报ReferenceError 
  let y = 22; 
  console.log(y); 
}

你预期输出是10 22,但实际报错,核心原因是JavaScript的暂时性死区(Temporal Dead Zone,简称TDZ)——这是let和const声明变量时的特有机制,和var的变量提升逻辑完全不同。

具体拆解一下:

  • 外层的let y = 10确实是一个有效的变量,但当你在内层的块级作用域里写了let y之后,这个块里的y就被绑定到当前块的作用域了。
  • 从这个块的开头,到let y = 22执行之前,这个y就处于「暂时性死区」:JS已经知道这个块里会有一个叫y的变量,但它还没完成初始化,这时候任何对y的访问都会直接抛出ReferenceError——哪怕外层有同名变量,JS也不会去外层找,因为当前块已经“预定”了这个变量名。
  • 所以你在let y = 22之前调用console.log(y)时,就触发了TDZ的报错。

想要达到预期效果的两种方案:

如果想输出10 22,可以选下面两种方式之一:

方案1:不重新声明内层变量,直接修改外层变量

let y = 10; 
{ 
  console.log(y); // 输出10
  y = 22; 
  console.log(y); // 输出22
}

方案2:保留内层声明,但调整顺序到访问之前

let y = 10; 
{ 
  let y = 22; 
  console.log(y); // 输出22
}
console.log(y); // 输出10

简单说:let/const的变量是「声明提升,但初始化不提升」,初始化前的这段“真空期”就是暂时性死区,这是JS为了避免变量未初始化就被误用的设计,和var那种可以先使用后声明的行为完全不一样。

内容的提问来源于stack exchange,提问作者Doaa Ismael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:17:27