let 与 var 的区别
2024年12月6日大约 2 分钟
var 和 let 是 JavaScript 中用来声明变量的两种方式,它们有以下主要区别:
1. 作用域
var- 作用域是函数作用域,即变量的作用范围被定义在其所在的函数中。
- 如果在块级作用域(如
if或for中)使用var声明,变量会被提升到函数作用域内。
function testVar() {
if (true) {
var x = 10;
}
console.log(x); // 输出 10
}let- 作用域是块级作用域,即变量的作用范围被限制在其所在的代码块
{}中。
- 作用域是块级作用域,即变量的作用范围被限制在其所在的代码块
function testLet() {
if (true) {
let y = 10;
}
console.log(y); // 报错:y is not defined
}2. 变量提升
var- 存在变量提升,即声明会被提升到作用域的顶部,但赋值不会被提升。
- 在提升的过程中,变量会被初始化为
undefined。
console.log(a); // 输出 undefined
var a = 5;let- 也存在变量提升,但不会被初始化。在声明之前访问会报错(暂时性死区)。
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 5;3. 重复声明
var- 允许在同一作用域内重复声明变量。
var c = 10;
var c = 20; // 不会报错
console.log(c); // 输出 20let- 不允许在同一作用域内重复声明变量。
let d = 10;
let d = 20; // 报错:Identifier 'd' has already been declared4. 全局对象属性
var- 在全局作用域中,
var声明的变量会成为全局对象(如window)的属性。
- 在全局作用域中,
var e = 10;
console.log(window.e); // 浏览器中输出 10let- 在全局作用域中,
let声明的变量不会成为全局对象的属性。
- 在全局作用域中,
let f = 10;
console.log(window.f); // 浏览器中输出 undefined总结
| 特性 | var | let |
|---|---|---|
| 作用域 | 函数作用域 | 块级作用域 |
| 变量提升 | 有(初始化为 undefined) | 有(但不初始化) |
| 重复声明 | 允许 | 不允许 |
| 全局对象属性 | 是 | 否 |
使用 let 能提供更严格的作用域控制,减少潜在的错误,因此在现代 JavaScript 中建议优先使用 let。