我很好奇javascript解释器为什么以及如何输出以下内容
5
5
5
5
5
运行此代码时:
for(var i=0;i<5;i++){
setTimeout(function(){console.log(i);},200);
};
任何人都可以提供详尽的解释吗?
答案 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,只有在记录之后。