奇怪的行为循环中的函数

时间:2015-09-02 08:17:35

标签: javascript loops lambda

我无法理解这段代码中发生了什么,它只打印13。

/*jshint loopfunc: true */
for(var i=0;i<13;i++)
    setTimeout(function(){console.log(i)},10); 

输出

13
13
...[10 times more]
13

如何用lambdas打印0,1,2,...,12,就像我希望的那样?

2 个答案:

答案 0 :(得分:2)

这应该有效:

for(var i=0;i<13;i++) {
    (function(j){
        setTimeout(function(){console.log(j)},10); 
    }(i))
} 

在原始代码中,i变量一直增加到13,然后被每个console.log语句使用。要解决这个问题,您可以创建一个匿名函数,并在循环的每次迭代中将i变量传递给它,这有效地在调用函数时获取i的值的快照,以便console.log打印出所需的值。

答案 1 :(得分:0)

试试这个:

for(var i=0;i<13;i++)
    setTimeout(function(index){console.log(index)}.bind(this, i),10);