ES6变量声明核心是let和const,解决var的作用域混乱、变量提升、意外覆盖问题;重点掌握作用域、提升行为、赋值规则、常见陷阱四条主线。

ES6 变量声明的核心是 let 和 const,它们共同解决了 var 长期存在的作用域混乱、变量提升、意外覆盖等问题。复习时不必死记语法表,重点抓住“作用域、提升行为、赋值规则、常见陷阱”四条主线。
块级作用域是根本区别
let 和 const 声明的变量只在 {} 包裹的代码块内有效,包括 if、for、while、独立花括号等场景:
-
var x = 1;在函数或全局中声明,整个函数/全局都可访问 -
let y = 2;写在if(true) { let y = 2; }里,外面就报ReferenceError - 循环中用
let i能避免闭包陷阱(每个迭代有独立绑定),而var i会导致所有回调共享同一个i
没有变量提升,但有暂时性死区(TDZ)
let/const 不像 var 那样被“提升到顶部并初始化为 undefined”,而是被提升但不初始化——在声明语句执行前访问,直接报错:
-
console.log(a); let a = 10;→ReferenceError -
console.log(b); const b = 20;→ 同样报错 - TDZ 从块开头开始,直到声明语句执行完毕;它不是“没声明”,而是“不可访问”
const 不等于“完全不可变”
const 约束的是“绑定不可变”,即变量不能再指向新地址,但对象/数组的内容仍可修改:
-
const obj = { name: 'Alice' };→obj.name = 'Bob'合法 -
const arr = [1, 2];→arr.push(3)合法 - 但
obj = {}或arr = []会报TypeError - 若需真正冻结内容,要用
Object.freeze()或递归深冻工具
使用建议:默认 const,必要时 let,避免 var
这是现代 JS 开发的通用实践:
- 声明后不再重新赋值的变量(如配置项、DOM 元素、函数引用、API 地址)一律用
const - 需要后续修改的变量(如计数器、临时状态、循环变量)才用
let -
var仅在兼容老环境或特殊场景(如函数作用域内多次声明)中考虑,日常开发中应主动规避 - 重复声明同名变量在 let/const 下是语法错误,反而是帮你提前发现潜在冲突


















