var
- 作用域:函数作用域(function scope)。
- 在函数内部声明的变量,只能在函数内部访问。
- 在函数外部声明的变量,会成为全局变量。
- 提升(Hoisting) :变量声明会被提升到函数或全局作用域的顶部,但赋值不会被提升。
- 重复声明:允许重复声明同一个变量。
- 全局属性:在全局作用域中声明的
var 变量会成为全局对象(如 window)的属性。
示例:
function example() {
if (true) {
var x = 10;
}
console.log(x);
}
example();
console.log(x);
let
- 作用域:块级作用域(block scope)。
- 提升:变量声明会被提升到块级作用域的顶部,但在声明之前访问会触发“暂时性死区”(Temporal Dead Zone, TDZ)。
- 重复声明:不允许重复声明同一个变量。
- 全局属性:在全局作用域中声明的
let 变量不会成为全局对象的属性。
示例:
function example() {
if (true) {
let y = 20;
console.log(y);
}
console.log(y);
}
example();
const
- 作用域:块级作用域(block scope)。
- 与
let 相同,const 声明的变量只能在块内访问。
- 提升:与
let 相同,存在暂时性死区。
- 重复声明:不允许重复声明同一个变量。
- 不可变性:
- 声明的变量必须初始化,且不能重新赋值。
- 如果变量是对象或数组,其属性或元素可以修改。
- 全局属性:在全局作用域中声明的
const 变量不会成为全局对象的属性。
示例:
const z = 30;
z = 40;
const person = { name: "Alice" };
person.name = "Bob";
console.log(person.name);
三者区别
| 特性 | var | let | const |
|---|
| 作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
| 提升 | 声明提升,赋值不提升 | 声明提升,存在 TDZ | 声明提升,存在 TDZ |
| 重复声明 | 允许 | 不允许 | 不允许 |
| 可变性 | 可重新赋值 | 可重新赋值 | 不可重新赋值 |
| 全局属性 | 是全局对象的属性 | 不是全局对象的属性 | 不是全局对象的属性 |
| 初始化 | 可不初始化 | 可不初始化 | 必须初始化 |
| 注意:避免使用var,优先使用const,必要时使用let | | |