javascript for循环意外行为

mgs*_*mgs 4 javascript loops

我有几个关于javascript for循环的问题.

第一个问题:

for (i=0; i<=2; i++) {;}
console.log(i);
Run Code Online (Sandbox Code Playgroud)

输出是3.不应该是2吗?

第二个问题:

for (var i=0; i<=2; i++) {
    setTimeout(function(){console.log(i);}, i*1000);
}
Run Code Online (Sandbox Code Playgroud)

超时设置正确:0,1000和2000.但输出为3,3,3(应为0,1,2).这是否意味着在循环退出后执行延迟函数?为什么?

我应该阅读什么来理解所有这些神秘的javascript东西?

谢谢.

CMS*_*CMS 10

第一个问题:

否,因为i变量在最后一次成功迭代后递增,然后检查条件并进行求值以false使循环结束.

该for声明由以下内容组成:

for ([initialExpression]; [condition]; [incrementExpression])
  statement
Run Code Online (Sandbox Code Playgroud)

它按以下步骤执行:

  1. 将initialExpression在开始评估
  2. 该condition评估,如果评估到false,循环结束,如果计算结果为true,该声明进行评估.
  3. 评估声明.
  4. 该incrementExpression评估,转到步骤2.

第二个问题:

该功能是异步执行后的循环已经结束,在这个时候你也知道i含有3.

此共同的解决方法是使用一个函数,以便保持在每一次迭代的循环变量的值,例如:

for (var i=0; i<=2; i++) {
  (function (i) {
    setTimeout(function(){console.log(i);}, i*1000);
  })(i);
}
Run Code Online (Sandbox Code Playgroud)