問題
實(shí)現(xiàn)異步循環(huán)時(shí),你可能會(huì)遇到問題。
讓我們?cè)囍鴮懸粋€(gè)異步方法,一次循環(huán)打印一次循環(huán)的索引值。
<script>for(var i = 0; i < 5; i++){setTimeout(function(){document.writeln(i);document.writeln("<br />");},1000);}</script> 如上程序的輸出為:
5
5
5
5
5
原因
每次時(shí)間結(jié)束(timeout)都指向原始的i,而并非它的拷貝。所以,for循環(huán)使i增長(zhǎng)到5,之后timeout運(yùn)行并調(diào)用了當(dāng)前i的值(也就是5)。
解決方法
有幾個(gè)不同的方式可以拷貝i。最普通且常用方法是通過聲明函數(shù)來建立一個(gè)閉包,并將i傳給此函數(shù)。我們這里使用了自調(diào)用函數(shù)。
運(yùn)行代碼
<script>for(var i = 0; i < 5; i++){(function(num){setTimeout(function(){document.writeln(num);document.writeln("<br />");},1000);})(i);}</script> 輸出
0
1
2
3
4



















