JavaScript循环中的setTimeout函数

 

 问题

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

让我们试着写一个异步方法,一次循环打印一次循环的索引值。
运行代码
for(var i = 0; i < 5; i++)
{//hovertree.com
setTimeout(function(){
console.log(i);
},1000);
}

 

http://hovertree.com/code/javascript/cnosbnt8.htm
如上程序的输出为:







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

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

运行代码

<script>for(var i = 0; i < 5; i++)
{//hovertree.com
(function(num){
setTimeout(function(){
document.writeln(num);document.writeln("<br />");
},1000);
})(i);
}</script>

http://hovertree.com/code/javascript/8hr4kdho.htm
输出

0
1
2
3
4

 

转载自:http://hovertree.com/h/bjaf/nebj8df9.htm

 http://hovertree.com/shortanswer/bjaf/18t390vi.htm

JS闭包新手入门总结

你可能感兴趣的:(JavaScript,html,js,Web,html5)