Skip to content

ES6中"let"与"var"的区别

Posted on:2023年10月12日 at 16:27

varlet 都是 JavaScript 中用于声明变量的关键字,但它们在作用域(scope)、提升(hoisting)和重新声明(redeclaration)方面有所不同。

作用域

这意味着使用 let 可以避免变量被意外覆盖,并使代码更加可读和易于维护。

提升

重新声明

闭包陷阱

var 声明的变量可以导致闭包陷阱(closure pitfalls)。这是一个常见错误的来源,尤其是在使用循环时。

例如,以下代码会打印 5 五次:

for (var i = 0; i < 5; i++) {
  setTimeout(function () {
    console.log(i); // 5
  }, 1000);
}

这是因为 i 变量被提升到循环的顶部,这意味着所有闭包都引用同一个变量。因此,当每个闭包执行时,它们都会打印出 5,因为 i 的值在循环结束后仍然是 5

要避免闭包陷阱,可以使用 let 来声明变量。以下代码会打印 0 到 4:

for (let i = 0; i < 5; i++) {
  setTimeout(function () {
    console.log(i);
  }, 1000);
}

这是因为 let 声明的变量具有块作用域,这意味着每个闭包都引用自己的 i 变量。因此,当每个闭包执行时,它们都会打印出自己 i 变量的值。

简洁性和易读性

使用 let 可以使代码更加简洁和易于理解。例如,以下代码使用 var 声明了一个变量,但很难理解该变量在代码中的作用:

var foo = 1;

function baz() {
  if (foo === 1) {
    // ...
  } else if (foo === 2) {
    // ...
  } else {
    // ...
  }
}

以下代码使用 let 声明了三个变量,使代码更加简洁和易于理解:

function baz() {
  if (foo === 1) {
    let bar = 1;
    // ...
  } else if (foo === 2) {
    let bar = 2;
    // ...
  } else {
    let bar = 3;
    // ...
  }
}

现在,很明显 bar 变量只在 if 语句中可用,并且它的值取决于 foo 的值。

减少错误

使用 let 可以帮助您减少错误。例如,以下代码会引发错误,因为变量 foo 已经声明:

var foo = 1;
let foo = 2; // SyntaxError: Identifier 'foo' has already been declared

使用 let 可以避免此类错误,因为 let 不允许在同一个作用域内重新声明变量。

结论

let 是 JavaScript 中声明变量的首选关键字。它具有块作用域,不会提升,可以避免变量被意外覆盖,并使代码更加简洁、易于理解和易于维护。

额外的优势

let 还有一些额外的优势,包括: