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

为什么使用let和const时不能在变量声明前进行赋值操作?

核心原因:let/const 存在**暂时性死区(Temporal Dead Zone, TDZ)**规则

你之前了解到的「提升是把声明移动到作用域顶部」其实是对var变量提升行为的通俗简化解释,这套逻辑不能直接套在ES6新增的let/const上。

实际JS引擎处理let/const的逻辑是:

  • 进入当前作用域时,就会先识别所有let/const声明的变量,确认这个作用域下存在这些变量,不会向上层作用域查找对应变量名,这就是大家说的「let/const也会提升」的部分
  • 但从进入作用域开始,到代码执行到你写的let/const声明语句这行之前的这段区间,就是这个变量的暂时性死区,这个区间内任何对该变量的操作,不管是读取还是赋值,都会直接抛出ReferenceError

你提到的三段代码的行为就可以直接用这个规则解释:

  1. 第一段报错的代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 04:51:02