1. var、let、const 在提升与暂时性死区的差异
var、let、const 在变量提升(hoisting)与暂时性死区(TDZ)方面有何差异?这些差异如何影响实际编码?
- var 的提升与初始化为 undefined
- let/const 的提升但未初始化,TDZ 期间访问报 ReferenceError
- const 的只读绑定与对象内容可变
var 声明的变量会被提升到函数作用域顶部并初始化为 undefined,因此在声明之前访问不会报错;let 与 const 同样会被提升,但进入"未初始化"状态,从作用域入口到声明语句执行之间形成暂时性死区(TDZ),此期间访问会抛 ReferenceError,typeof 也无法豁免。const 除 TDZ 外还要求声明时初始化,且绑定不可重新赋值,但对象或数组的成员仍可修改。for 循环中 let 每次迭代创建独立绑定,闭包捕获正确;var 则共享同一绑定,配合异步回调会产生经典的"循环变量共享"问题。
本题考察声明机制的本质:三者都会被提升,差异在于初始化时机与绑定可变性。回答时抓住"TDZ 是提升后未初始化造成的访问窗口"这一核心,并结合 for 循环闭包、const 引用可变等工程场景说明差异的实际影响,比单纯背结论更有说服力。