三者区别可以从四个维度看:作用域上 var 是函数作用域,let 与 const 是块级作用域;提升上 var 会提升并初始化为 undefined,let 与 const 也有提升但处于暂时性死区,提前访问直接报错;重复声明上 var 允许,let 与 const 不允许;const 声明的基本类型不可重新赋值,但对象类型的属性仍可修改。
面试常配代码题考察输出顺序:涉及 var 提升与 let 暂时性死区、for 循环中 var 与 let 的差别(let 每轮迭代是一个新作用域,经典题是 for 加 setTimeout 打印)。答题策略是先把四条区别列清楚,再用一段代码印证,最后给出工程建议:默认用 const、可变才 let、避免 var。
// var:所有迭代共享一个 i(函数作用域) for (var i = 0; i < 3; i++) { setTimeout(function () { console.log('var:', i); }, 0); // 3 3 3 } // let:每轮迭代都是一个全新的块级作用域 for (let j = 0; j < 3; j++) { setTimeout(function () { console.log('let:', j); }, 0); // 0 1 2 } // 暂时性死区:声明之前访问直接报错 try { console.log(tdZ); // ReferenceError } catch (e) { console.log(e.name, '暂时性死区'); } let tdZ = 1;