为什么使用let和const时不能在变量声明前进行赋值操作?
核心原因:let/const 存在**暂时性死区(Temporal Dead Zone, TDZ)**规则
你之前了解到的「提升是把声明移动到作用域顶部」其实是对var变量提升行为的通俗简化解释,这套逻辑不能直接套在ES6新增的let/const上。
实际JS引擎处理let/const的逻辑是:
- 进入当前作用域时,就会先识别所有
let/const声明的变量,确认这个作用域下存在这些变量,不会向上层作用域查找对应变量名,这就是大家说的「let/const也会提升」的部分 - 但从进入作用域开始,到代码执行到你写的
let/const声明语句这行之前的这段区间,就是这个变量的暂时性死区,这个区间内任何对该变量的操作,不管是读取还是赋值,都会直接抛出ReferenceError
你提到的三段代码的行为就可以直接用这个规则解释:
- 第一段报错的代码:
console.log(name); let name = "hi";
执行console.log时还在name的TDZ区间,访问直接报错,这个和你理解的一致。
2. 你疑惑的提前赋值的代码:
name = "hi"; let name; console.log(name);
给name赋值的操作发生在let name声明语句执行之前,仍然处于TDZ,所以赋值操作也会直接触发报错,不会像var那样允许提前赋值。
3. 正常运行的代码:
let name; name = "hi"; console.log(name);
执行到let name这行时,TDZ就结束了,变量会被初始化为undefined,之后的赋值、读取操作都符合规则,所以运行正常。
这个设计的初衷就是为了规避var时代允许变量提前使用带来的大量隐性bug,强制要求开发者遵循「先声明、后使用」的编码习惯,降低代码出问题的概率。
内容的提问来源于stack exchange,提问作者NewbieToCoding
相关产品推荐
相关产品推荐

