JavaScript let 与 var

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

let 关键字是在 JavaScript 的较新版本,即 **ES6(ES2015)** 中引入的。它是声明变量的首选方式。


JavaScript let 与 var

以下是 letvar 之间差异的概述。

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

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

var 是函数作用域

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

// program to print text
// variable a cannot be used here
function greet() {
    // variable a can be used here
    var a = 'hello';
    console.log(a);
}
// variable a cannot be used here

greet(); // hello

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

let 是块级作用域

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

// program to print the text
// variable a cannot be used here
function greet() {
    let a = 'hello';

    // variable b cannot be used here
    if(a == 'hello'){
        // variable b can be used here
        let b = 'world';
        console.log(a + ' ' + b);
    }

     // variable b cannot be used here
    console.log(a + ' ' + b); // error
}
// variable a cannot be used here

greet();

输出

hello world
Uncaught ReferenceError: b is not defined

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

然而,变量 bif 块语句内部声明。 b 将具有块级作用域,并且只能在 if 块内部访问。

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

注意:在函数内部声明的变量对于 varlet 都将是函数作用域。


let 不允许重新声明变量

1. 使用 var 声明的变量可以再次重新声明。例如:

var a = 5; // 5
var a = 3; // 3

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

let a = 5;
let a = 3; // error 

输出

Uncaught SyntaxError: Identifier 'a' has already been declared

2. 在不同的作用域或块中用 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

3. 当在循环中使用 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 (not an error)

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 将具有全局作用域,并且可以在程序中的任何位置访问。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战