For循环行为中的Javascript setTimeOut

时间:2014-03-21 10:27:53

标签: javascript

我很好奇javascript解释器为什么以及如何输出以下内容

5
5
5
5
5

运行此代码时:

for(var i=0;i<5;i++){
setTimeout(function(){console.log(i);},200);  
};

任何人都可以提供详尽的解释吗?

2 个答案:

答案 0 :(得分:4)

与年表有关。

请记住,超时是一个延迟的同步操作,所以当它运行时,它会查询i并找到它的值为5.这是因为(同步)循环的最后一个操作是将其值设置为5:它达到4(循环的最后一次迭代),然后i++使其为5。

如果要输出0-4但保留超时,则需要在创建超时时捕获i的当前迭代值。您可以通过将其传递给立即执行的函数来完成此操作:

for(var i=0;i<5;i++)
    setTimeout((function(i) { return function(){ console.log(i); }; })(i),200);

答案 1 :(得分:0)

我认为在原始示例中看到变量i的最接近范围是有帮助的,当在日志中调用时,它是全局范围。考虑到这一点以及for和setimeout是同步操作的事实,一个接一个地执行,我得到5,只有在记录之后。