2010-07-03 106 views
4

我有几个关于JavaScript的for循环的问题。JavaScript的for循环意外行为

第一个问题:

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

输出为3。它不应该是2?

第二个问题:

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

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

我应该看明白这一切的神秘JavaScript的东西吗?

谢谢。

+0

+1我也在找) – naiad 2010-07-03 06:51:54

回答

9

第一个问题:

没有因为i变量上次成功迭代后递增,则条件检查和评估为false如此循环结束。

for语句组成:

for ([initialExpression]; [condition]; [incrementExpression]) 
    statement 

而且它执行下面的步骤:

  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); 
}