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

关于let声明提升:为何两段JavaScript代码执行结果不同?

为什么两个let代码段的执行结果不同?

第一个代码段:输出undefined

let a  
console.log(a)
a = 20

执行let a时,JavaScript已经在当前作用域完成了变量a的声明(也就是常说的“提升”),但并未给它赋值。此时变量a已经脱离了暂时性死区(TDZ),可以被安全访问。因为还未赋值,所以console.log(a)输出undefined,后续的a = 20只是补赋值操作,不影响之前的输出结果。

第二个代码段:抛出ReferenceError

console.log(a)
let a = 20

let a的声明确实会被提升到作用域顶部,但从作用域开始到let a这条语句执行前的范围,就是变量a的暂时性死区。在TDZ内访问变量会直接触发错误,哪怕声明语句就在下一行也不行。所以console.log(a)执行时,a还处于TDZ中,会抛出ReferenceError。

核心区别就是访问变量的时机:let声明语句执行后,变量脱离TDZ,可访问(未赋值则为undefined);声明语句执行前,变量处于TDZ,禁止访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:27:06