js实现异步循环

@(编程)

问题

实现异步循环时,你可能会遇到问题。

让我们试着写一个异步方法,每秒打印一次循环的索引值。

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

如上程序的输出为:

5 
5 
5 
5 
5 
  

原因

每次时间结束(timeout)都指向原始的i,而并非它的拷贝。所以,for循环使i增长到5,之后timeout运行并调用了当前i的值(也就是5)。

解决方法

有几个不同的方式可以拷贝i。最普通且常用方法是通过声明函数来建立一个闭包,并将i传给此函数。我们这里使用了自调用函数。

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

输出

0
1
2
3
4

参考

https://github.com/loverajoel/jstips

posted @ 2016-02-10 23:11  wardensky  阅读(1245)  评论(0编辑  收藏  举报