var、let、const的核心区别在于:①作用域——var为函数/全局作用域,let/const为块级作用域;②提升机制——var声明与初始化分离(值为undefined),let/const存在暂时性死区(TDZ);③赋值约束——var/let可重赋值,const必须初始化且不可重新赋值(但对象属性可变)。

直接抓住三个关键词:作用域、提升机制、赋值约束。面试官问“怎么声明变量”,不是让你背语法,而是想看你是否理解底层行为差异。
重点对比 var / let / const 的行为差异
别只说“var 是函数作用域,let 和 const 是块作用域”——要带出实际影响:
- var:声明会被提升到函数或全局顶部,但赋值不提升;可重复声明;在 if/for 块里声明,外部仍能访问
-
let:声明会提升,但处于“暂时性死区(TDZ)”,从块开头到初始化前访问会报
ReferenceError;禁止重复声明;块级生效(如 for 循环中每次迭代都是独立绑定) - const:和 let 一样有 TDZ 和块作用域;必须声明时赋值;不可重新赋值(注意:对象/数组本身可修改属性或元素,只是地址不能变)
高频陷阱题怎么拆解回答
遇到类似下面的代码题,按“执行顺序 + 提升结果 + 作用域边界”三步说清:
-
console.log(a); var a = 1;→ 回答:“输出 undefined。因为 var 声明被提升,但赋值没提升,等价于var a; console.log(a); a = 1;” -
console.log(b); let b = 2;→ 回答:“报 ReferenceError。let 声明虽提升,但 b 在初始化前处于暂时性死区,不允许读取” -
for (var i = 0; i console.log(i), 0);→ 回答:“输出三个 3。var 没有块级作用域,i 是全局变量;用 let 就会输出 0、1、2,因为每次循环都创建新绑定”
补充一个加分细节:命名与初始化规范
顺带提一句实践习惯,显得更真实:
- 变量名用小驼峰,避免数字开头、连字符或中文
- 优先用 const,仅当值需重赋时才用 let;基本不用 var(除非兼容老环境)
- 声明即初始化,尤其 const 必须赋值;let 虽可延迟赋值,但建议尽量靠近使用处声明
把这三点讲清楚,比罗列十种写法更有说服力。


















