2

我最近遇到了这段代码:

for (const temp of [1,2]) {
  // do something
}

我认为最好使用let声明,temp因为这样变量只会被声明一次。但是,我也通过 babel 运行了这个示例以及版本,let这就是我所看到的:

for (const p of [1,2]) {

}

for (let s of [1,2]) {

}

变成:

for (var _i = 0, _arr = [1, 2]; _i < _arr.length; _i++) {
  var p = _arr[_i];
}

for (var _i2 = 0, _arr2 = [1, 2]; _i2 < _arr2.length; _i2++) {
  var s = _arr2[_i2];
}

所以 babel 对待constlet相同。我想知道 Javascript 运行时是否在引擎盖下同样对待这 2 个版本。得出的结论是即使let在循环内声明了一个变量,它仍然会在每次迭代时重新声明?

4

1 回答 1

7

我认为最好对 temp 使用 let 声明,因为这样变量只会被声明一次。

无论哪种方式,每次循环迭代都会声明一个新版本;这对于解决闭环问题很重要:

const array = [1, 2, 3, 4];
for (const entry of array) {
    setTimeout(() => {
        console.log(entry);
    }, 0);
}

如果没有为每次循环迭代创建新变量,则将记录相同的值(可能是 4)四次。

选择letconst归结为:

  1. 您希望能够在循环中为其分配一个新值吗?

  2. 您的个人风格偏好(或您团队的偏好)。

我想知道 Javascript 运行时是否在引擎盖下同样对待这 2 个版本。

是的,除此之外,如果您愿意,您可以在循环中为变量分配let一个新值。¹例如:

const strings = ["a", "b", "c"];
for (let str of strings) {
    str = str.toUpperCase();
    console.log(str);
}

例如,唯一的区别是变量是否可变。


¹为免生疑问:分配给它的只是更改该变量的值。它对值来自的数组/可迭代对象没有影响。

于 2019-09-25T15:30:15.377 回答