我的价值会复制到下一个词汇环境吗?我很困惑

时间:2018-08-19 17:44:46

标签: javascript

我不太了解代码中发生了什么,为什么只打印值1。

for (let i = 0; i < 2; i++) {
  setTimeout(() => console.log(i));
  i++;
}

2 个答案:

答案 0 :(得分:1)

letfor循环中的工作方式是,对于每次循环迭代,都会创建一个单独变量;这主要是因为像您这样的循环闭包比以前更简单。因此请记住:

  1. 您从i = 0开始。
  2. 0 < 2开始,第一个循环主体使用i的副本执行。
  3. 您安排一个回调日志记录该i的副本。
  4. 然后,将i递增i++;,并在循环主体的末尾。现在,i的副本的值为1
  5. 然后,在完成for循环的增量部分后,在给定第一个(i)值的情况下,创建一个 second 1,并然后增加。因此,第二个i的值为2
  6. 由于2 < 2为假,因此循环停止。
  7. 稍后,将执行在步骤#3中安排的回溯,并记录第一个i1)的值。

这与使用var而不是let时代码的行为有根本不同,这是let如此方便的原因之一。

答案 1 :(得分:0)

这是因为setTimeOut方法在循环结束后运行。在您的情况下,您将在循环中再次增加该值,因此,在此之后,let范围给出i的值,即现在的1

改为执行以下操作:

for (let i = 0; i < 2; i++) {
  setTimeout(() => console.log(i));
}