JS中let与var自动初始化行为差异及let声明等价性疑问
要理解示例2中两种let声明写法的等价性,我们可以结合var的差异对照来看:
1. 先明确var两种写法的差异根源
var存在变量提升且支持重复声明:
- 仅写
var studentName;的重复声明属于无操作,不会覆盖变量已有的值 - 写
var studentName = undefined;的重复声明会执行赋值操作,覆盖原有值
这是var下两种写法不等价的核心场景。
2. let天然消除了上述差异场景
let不允许同一作用域内重复声明,如果你先写了let studentName = "Suzy",后续再写任何形式的let studentName声明都会直接抛出语法错误,根本不会出现var那种重复声明的场景。
3. 示例2的两种写法执行流程完全一致
你可以分别运行示例2的两个版本:
版本1:隐式赋值undefined
let studentName; studentName = "Suzy"; console.log(studentName); // Suzy
执行流程:
- 进入作用域时
studentName处于TDZ(临时死区),不可访问 - 执行到
let studentName;语句时,自动给变量赋值undefined完成初始化,退出TDZ - 后续赋值、打印逻辑正常执行
版本2:显式赋值undefined
let studentName = undefined; studentName = "Suzy"; console.log(studentName); // Suzy
执行流程:
- 进入作用域时
studentName处于TDZ,不可访问 - 执行到
let studentName = undefined;语句时,显式给变量赋值undefined完成初始化,退出TDZ - 后续赋值、打印逻辑和版本1完全一致
两种写法从TDZ表现、初始化时机、后续操作的结果没有任何区别,这就是二者行为等价的体现。
内容的提问来源于stack exchange,提问作者user51462
相关产品推荐
相关产品推荐

