在 JavaScript 中,let
和 var
都是用来声明变量的关键字,但它们之间存在一些重要的区别:
var
在声明变量时具有函数级作用域,这意味着在函数内部用 var
声明的变量在整个函数内部都是可见的。而 let
具有块级作用域,它在声明变量时只在该块(以及任何包含块)内部可见。function testVar() {
var x = 10;
let y = 20;
if(true) {
var x = 30; // 这是合法的,因为 x 的作用域是整个函数
console.log(x); // 输出 30
}
console.log(x); // 输出 30
console.log(y); // 输出 20
}
testVar();
在上述例子中,我们在 if
块内部重声明了 x
,这是合法的,因为 x
的作用域是整个函数。然而,我们在 if
块内部试图访问 y
,这将导致错误,因为 y
的作用域仅限于包含它的块。
2. 提升(Hoisting):在 JavaScript 中,变量的声明会被“提升”到它们所在的作用域的顶部。这意味着你可以在声明之前使用变量。对于 var
声明的变量,会发生提升。但是对于 let
和 const
声明的变量,虽然也会被提升,但是你不能在声明之前访问它们(尝试这样做会抛出错误)。
console.log(x); // 在 let x = 10; 之前,尝试访问 x 会抛出错误
let x = 10;
var
可以多次声明同一个变量,而 let
在同一个作用域内不允许重复声明同一个变量。var
声明的变量会成为全局对象(通常是 window
)的属性,而 let
声明的变量不会。let
声明的变量在每个块(以及包含块)中都具有自己的独立作用域,即使这些块嵌套在一起。这意味着在嵌套的块中声明的变量不会与外部块的变量共享作用域。const
是 let
的一个特殊形式,它用于声明一个只读的常量。一旦一个变量被 const
声明,它的值就不能改变(除非它被重新声明)。注意,对于对象和数组来说,只有对象的属性(而非对象本身)可以被声明为只读的。var
在全局作用域声明的变量将成为 window
对象的一个属性,而在 Node.js 中则不会。然而,使用 let
和 const
在全局作用域中声明的变量在两者中都不会成为 window
或全局对象的属性。