文章目录
- JavaScript 中 var、let、const 的差异
- 1. 作用域(Scope)
- 2. 变量提升(Hoisting)
- 3. 重复声明
- 4. 变量值是否可变
- 对比表
- 5. 示例代码
- 总结
JavaScript 中 var、let、const 的差异
1. 作用域(Scope)
-
var
- 函数作用域(function scope)
- 在函数内部用 var 声明的变量,只在函数内部可见。
- 在块
{}
中声明的 var,会“泄露”到外层。
-
let / const
- 块级作用域(block scope)
- 在
{}
内声明,只在这个块内有效(如 if、for、while 块)。
2. 变量提升(Hoisting)
-
var
- 会被提升(hoisting)到作用域顶端,声明提前,但赋值不提前。
- 使用前变量值是
undefined
。
-
let / const
- 也会提升,但存在 暂时性死区(TDZ,Temporal Dead Zone)。
- 在声明之前访问会报错。
3. 重复声明
-
var
- 在同一作用域中可以重复声明,不会报错(但会覆盖)。
-
let / const
- 在同一作用域中不能重复声明,否则报错。
4. 变量值是否可变
-
var / let
- 都可以重新赋值。
-
const
- 声明后必须立即赋值,且不能重新赋值。
- 注意:如果 const 指向对象/数组,内部属性仍然可以修改。
对比表
特性 | var | let | const |
---|---|---|---|
作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
变量提升 | 有,值为 undefined | 有,但存在暂时性死区 | 有,但存在暂时性死区 |
重复声明 | 允许 | 不允许 | 不允许 |
是否必须赋初值 | 否 | 否 | 是 |
是否可重新赋值 | 可以 | 可以 | 不可以(引用可变) |
5. 示例代码
// var 演示
if (true) {var a = 10;
}
console.log(a); // 10 (变量泄露出块作用域)// let 演示
if (true) {let b = 20;
}
// console.log(b); // 报错:b is not defined// const 演示
const PI = 3.14;
// PI = 3.14159; // 报错:Assignment to constant variableconst obj = { name: "Tom" };
obj.name = "Jerry"; // ✅ 可以修改对象属性
console.log(obj.name); // Jerry
总结
var
:老语法,函数作用域,会变量提升。let
:推荐,块级作用域,可重新赋值。const
:推荐,块级作用域,声明常量,引用不可变。