let / const / var 与暂时性死区
先理解原理和示例,再练习完整口述与追问。
回答要点
块作用域;初始化前不可访问;const 不冻结对象。
原理拆解
var 通常属于函数作用域或脚本的相关环境,let、const 属于块级词法绑定。绑定创建后何时初始化决定了声明前访问的差别。const 限制的是绑定重新赋值,不是深度冻结对象;同一代码块里不能重复声明同名词法绑定。循环中 let 可以为每轮迭代提供独立绑定,避免多个回调共用 var 的最后一个值。
示例与推演
const callbacks = []
for (let i = 0; i < 3; i++) callbacks.push(() => i)
console.log(callbacks.map(fn => fn())) // [0, 1, 2]
const user = { name: 'A' }
user.name = 'B' // 允许,未重新绑定 user
把 let 换成同一函数里的 var,回调读取同一绑定,循环结束后通常都得到 3。
易错点
不要通过 typeof 断言所有未初始化变量都安全:对暂时性死区中的 let/const 使用 typeof 也会抛错。Object.freeze 也只是浅冻结。
参考回答可直接练习口述
var 通常是函数作用域,声明提升后在初始化前可读到 undefined;let/const 是块作用域,进入作用域到声明初始化之前处于暂时性死区,访问会报错。const 限制绑定重新赋值,不会深度冻结对象。循环里的 let 可为每次迭代建立独立绑定,因此异步回调不会都读取同一个最终索引。