为何这段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
相关产品推荐
相关产品推荐

