跳到主要内容

JavaScript let 与 var 的对比

在 JavaScript 中,letvar 是用于声明变量的关键字,但它们有显著区别:

  1. 作用域差异let 是块级作用域,意味着它只在声明它的代码块内有效。而 var 是函数级作用域,它在整个封闭函数内有效,甚至在函数外也可能有效。

  2. 重复声明的规则:使用 let 声明的变量不能在同一作用域内重新声明,但 var 允许在同一作用域内重复声明变量。

  3. 变量提升现象var 声明的变量会发生变量提升,这意味着无论变量在函数的哪个部分声明,都会被视为在函数顶部声明。相反,let 声明的变量不会提升,它们保留在声明它们的块级作用域中。

这些区别对于理解和使用 JavaScript 编程非常重要,因为它们会影响变量的可访问性和生命周期。

在 JavaScript 中,关键字 varlet 都用于声明变量。

let 关键字是在 JavaScript 的后期版本 ES6(ES2015) 中引入的。它是声明变量的首选方式。

JavaScript let 与 var 的区别

这里是 letvar 之间区别的概览。

letvar
let 是块级作用域。var 是函数级作用域。
let 不允许重新声明变量。var 允许重新声明变量。
let 中不发生变量提升(Hoisting)。var 中发生变量提升(Hoisting)。

JavaScript let 与 var 在局部作用域中的使用

var 是函数级作用域

在函数内部用 var 声明的变量,在函数的任何地方都可以使用。例如,

// 程序用于打印文本
// 此处不能使用变量 a
function greet() {
// 此处可以使用变量 a
var a = "hello";
console.log(a);
}
// 此处不能使用变量 a

greet(); // hello

在上面的程序中,变量 a 是用 var 声明的。变量 a 可以在函数 greet 的任何地方使用。

let 是块级作用域

let 声明的变量只能在代码块内访问。例如,

// 程序用于打印文本
// 此处不能使用变量 a
function greet() {
let a = "hello";

// 此处不能使用变量 b
if (a == "hello") {
// 此处可以使用变量 b
let b = "world";
console.log(a + " " + b);
}

// 此处不能使用变量 b
console.log(a + " " + b); // 报错
}
// 此处不能使用变量 a

greet();

输出

hello world
Uncaught ReferenceError: b is not defined

在上面的程序中,变量 a 在函数内部声明,可以在函数的任何地方访问(a 是函数级作用域)。

然而,变量 b 是在 if 语句块内声明的。b 将是块级作用域,只能在 if 语句块内访问。

因此,当你尝试在 if 语句块外访问 b 时,会发生错误(如上面程序所示)。

注意:在函数内部声明的变量,无论是 var 还是 let,都会是函数级作用域。

let 不允许重新声明变量

  1. var 声明的变量可以再次声明。例如,
var a = 5; // 5
var a = 3; // 3

在同一个块或同一个作用域内,用 let 声明的变量不能重新声明。例如,

let a = 5;
let a = 3; // 报错
```**输出**

```javascript
Uncaught SyntaxError: 标识符 'a' 已被声明
  1. 在不同作用域或块中重新声明 var 变量会改变外部变量的值。例如,
var a = 5;
console.log(a); // 5
{
var a = 3;
console.log(a); // 3
}
console.log(a); // 3

在不同作用域或块中重新声明 let 变量时,会将该变量视为不同的变量。外部变量的值不会改变。例如,

let a = 5;
console.log(a); // 5
{
let a = 3;
console.log(a); // 3
}
console.log(a); // 5
  1. 使用 var 声明的变量在循环中,该变量的值会改变。例如,
var a = 2;
for (var a = 0; a < 3; a++) {
console.log("hello");
}
console.log(a); // 3

在上述程序中,for 循环重新声明了变量 a。因此最终 a 的值变为 3

使用 let 声明的变量在循环中,变量的值不会改变。例如,

let a = 2;
for (let a = 0; a < 3; a++) {
console.log("hello");
}
console.log(a); // 2

在上述程序中,for 循环将变量 a 视为与上面声明的变量不同的变量。且该变量的作用域仅在 for 循环内。因此最终变量 a 的值保持为 2

let 不允许变量提升

var 声明的变量会提升到程序的作用域顶部。例如,

console.log(a);
var a; // undefined(不是错误)

关键字 let 不允许变量提升。例如,

console.log(a);
let a; // Uncaught ReferenceError: a is not defined

如果您想了解更多关于变量提升的信息,可以访问 JavaScript 变量提升

let 和 var 的浏览器支持

大多数现代浏览器都支持 let 的使用。然而,有些浏览器对 let 的支持并不完全。

要了解更多,请访问 JavaScript let 浏览器支持情况

注意:在全局作用域中,varlet 的行为相同。例如,

var a = 5; // 5

变量 a 将是全局作用域,并且可以在程序的任何地方访问。

let a = 5; // 5

变量 a 也将是全局作用域,并且可以在程序的任何地方访问。