循環(huán)中使用閉包,假設(shè)我們需要在每次循環(huán)中調(diào)用循環(huán)序號
成都創(chuàng)新互聯(lián)公司2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元南昌縣做網(wǎng)站,已為上家服務(wù),為南昌縣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
上面的代碼不會輸出數(shù)字 0 到 9,而是會輸出數(shù)字 10 十次。
當(dāng) console.log 被調(diào)用的時(shí)候, 匿名函數(shù)保持對外部變量 i 的引用,此時(shí) for循環(huán)已經(jīng)結(jié)束, i 的值被修改成了 10.
為了得到想要的結(jié)果,需要在每次循環(huán)中創(chuàng)建變量 i 的 拷貝。
避免引用錯(cuò)誤
為了正確的獲得循環(huán)序號,最好使用 匿名包裹器。
for(var i = 0; i < 10; i++) {
(function(e) {
setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}
外部的匿名函數(shù)會立即執(zhí)行,并把 i 作為它的參數(shù),此時(shí)函數(shù)內(nèi) e 變量就擁有了 i 的一個(gè)拷貝。
當(dāng)傳遞給 setTimeout 的匿名函數(shù)執(zhí)行時(shí),它就擁有了對 e 的引用,而這個(gè)值是 不會被循環(huán)改變的。
有另一個(gè)方法完成同樣的工作;那就是從匿名包裝器中返回一個(gè)函數(shù)。這和上面的代碼效果一樣。
for(var i = 0; i < 10; i++) {
setTimeout((function(e) {
return function() {
console.log(e);
}
})(i), 1000)
}