var、let和const的核心区别在于作用域规则、变量提升行为和重复声明限制:var是函数作用域、声明提升且可重复声明;let/const是块级作用域、存在暂时性死区、禁止重复声明;const还要求声明时赋值且不可重新赋值。

JavaScript中var、let和const的核心区别不在“能不能改值”,而在于**作用域规则、变量提升行为和重复声明限制**这三方面。理解它们的关键是看“变量何时被创建”“在哪里能访问”以及“能否重新赋值或重声明”。
作用域:函数级 vs 块级
var只有函数作用域(或全局作用域),没有块级作用域;let和const则是严格的块级作用域(由{}界定)。
-
var在if或for块内声明,仍可在块外访问 -
let/const在if或for块内声明,块外直接引用会报ReferenceError - 函数内部的
var不会影响外部同名变量;但let/const在嵌套块中声明,会形成独立绑定
变量提升:声明提升 vs 暂时性死区
var声明会被提升到函数/全局顶部,且初始化为undefined;let和const声明虽也被提升,但在声明前访问会触发ReferenceError——这段区域叫“暂时性死区”(TDZ)。
-
console.log(a); var a = 1;→ 输出undefined -
console.log(b); let b = 2;→ 报错:Cannot access 'b' before initialization -
const同样有TDZ,且必须在声明时赋值
可变性与重声明:赋值限制 ≠ 不可变对象
const不表示“常量”,而是“不可重新赋值的绑定”。它禁止的是对变量标识符的再次赋值,不冻结对象或数组内容。
立即学习“Java免费学习笔记(深入)”;
-
var和let允许重复赋值;const不允许(如const x = 1; x = 2;报错) -
var允许在同一作用域重复声明(var a; var a;合法);let/const不允许(重复声明即报SyntaxError) -
const obj = {x: 1}; obj.x = 2;✅ 合法(修改属性);obj = {};❌ 报错(重新赋值)
实际使用建议
现代JS开发应默认用const,仅当变量后续需重新赋值时才用let,基本避免var。
- 函数参数、循环计数器、临时中间值等明确只读场景,优先
const - 需要多次更新的变量(如累加器、状态切换标记),用
let -
var仅在需兼容极老环境或刻意利用函数作用域/变量提升时考虑,日常应避开










