无法计算出简单 javascript 代码的输出

Unable to figure out the output of simple javascript code

function func2() {
  for (let i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 2000);
  }
}

func2();

由于closureconsole.log语句应该记住它的外部词法环境,首先是setTimeout,然后是for循环。由于 isetTimeout 上下文中不可用,它会在 for 循环的执行上下文中查找,并在那里搜索 i 的值。

现在,对于 console.log 的所有三个执行,该值在 2 秒后应该是 3。但它将输出显示为:

0
1
2

您使用了 let,即 block scoped,因此每个 for 循环迭代都会有单独的 i

1)如果你想输出连续的3所以你可以在for-loop之外声明i,那么只有单个 i,值为 3

function func2() {
  let i;
  for (i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 2000);
  }
}

func2();

2) 如果你想要相同的词法范围那么你也可以在这里使用 var,

var is function scoped, So there will only be one i

function func2() {
  for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 2000);
  }
}

func2();