ES6用let和const解决var的变量提升与作用域问题:let引入暂时性死区(TDZ)杜绝声明前访问,提供块级作用域;const强制初始化、不可重赋值且同样具备块级作用域和TDZ;二者均禁止重复声明,提升代码健壮性。

ES6 用 let 和 const 彻底改变了变量声明方式,直接针对 var 带来的变量提升和函数作用域局限问题给出了解决方案。
let 消除变量提升,引入暂时性死区
var 声明的变量会被“提升”到作用域顶部,即使还没执行到声明语句,也能访问(值为 undefined)。这容易引发逻辑错误。let 不会提升变量声明,而是在声明前访问会报 ReferenceError —— 这就是“暂时性死区”(TDZ)。
-
console.log(a); let a = 1;→ 报错,不能在声明前使用 -
console.log(b); var b = 2;→ 输出undefined,因 var 被提升 - TDZ 让代码行为更可预测:变量必须先声明、后使用
let 和 const 提供真正的块级作用域
ES6 之前,{}(如 if、for 内部)不构成独立作用域,var 声明的变量会泄露到外层。let/const 将作用域精确控制在最近的花括号内。
-
if (true) { let x = 10; } console.log(x);→ 报错,x仅在 if 块内有效 -
for (let i = 0; i console.log(i), 0); }→ 正确输出 0、1、2(每次迭代创建独立绑定) - 对比
var i:循环结束后i仍存在,且所有回调都输出 3
const 强化不可变语义与初始化约束
const 不只是“不能重新赋值”,它还强制要求声明时初始化,并天然具备块级作用域和 TDZ 特性。
立即学习“Java免费学习笔记(深入)”;
-
const PI;→ 报错,缺少初始化值 -
const PI = 3.14159; PI = 3.14;→ 报错,禁止重复赋值 -
const obj = { a: 1 }; obj.a = 2;→ 允许(对象本身未被重赋值,只是属性修改) -
obj = {};→ 报错,因为这是对常量标识符的重新赋值
避免重复声明,提升代码健壮性
let 和 const 在同一作用域中禁止重复声明,包括与函数参数同名的情况,从语法层面防止覆盖和歧义。
-
let count = 1; let count = 2;→ 报错 -
function foo(count) { let count = 10; }→ 报错,参数已声明,let 不允许遮蔽 -
var count = 1; let count = 2;→ 报错,不同关键字在同一作用域也禁止重名


















