第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js閉包在循環(huán)語句中的一個問題

js閉包在循環(huán)語句中的一個問題

慕工程0101907 2019-04-21 20:38:40
window.onload=function(){varlis=document.getElementsByTagName('li');varlen=lis.length;for(vari=0;i
查看完整描述

2 回答

?
www說

TA貢獻(xiàn)1775條經(jīng)驗 獲得超8個贊

這里有這個for循環(huán)案例的詳解:[JS進(jìn)階]閉包,作用域鏈,垃圾回收,內(nèi)存泄露
實例2:給每個li添加點擊事件
varoli=document.getElementsByTagName('li');
vari;
for(i=0;i<5;i++){
oli[i].onclick=function(){
alert(i);
}
}
console.log(i);//5
//執(zhí)行匿名函數(shù)
(function(){
alert(i);//5
}());
上面是一個經(jīng)典的例子,我們都知道執(zhí)行結(jié)果是都彈出5,也知道可以用閉包解決這個問題,但是我剛開始始終不能明白為什么每次彈出都是5,為什么閉包可以解決這問題。后來捋一捋還是把它弄清晰了:
a.先來分析沒用閉包前的情況:for循環(huán)中,我們給每個li點擊事件綁定了一個匿名函數(shù),匿名函數(shù)中返回了變量i的值,當(dāng)循環(huán)結(jié)束后,變量i的值變?yōu)?,此時我們再去點擊每個li,也就是執(zhí)行相應(yīng)的匿名函數(shù)(看上面的代碼),這是變量i已經(jīng)是5了,所以每個點擊彈出5.因為這里返回的每個匿名函數(shù)都是引用了同一個變量i,如果我們新建一個變量保存循環(huán)執(zhí)行時當(dāng)前的i的值,然后再讓匿名函數(shù)應(yīng)用這個變量,最后再返回這個匿名函數(shù),這樣就可以達(dá)到我們的目的了,這就是運用閉包來實現(xiàn)的!
b.再來分析下運用閉包時的情況:
varoli=document.getElementsByTagName('li');
vari;
for(i=0;i<5;i++){
oli[i].onclick=(function(num){
vara=num;//為了說明問題
returnfunction(){
alert(a);
}
})(i)
}
console.log(i);//5
這里for循環(huán)執(zhí)行時,給點擊事件綁定的匿名函數(shù)傳遞i后立即執(zhí)行返回一個內(nèi)部的匿名函數(shù),因為參數(shù)是按值傳遞的,所以此時形參num保存的就是當(dāng)前i的值,然后賦值給局部變量a,然后這個內(nèi)部的匿名函數(shù)一直保存著a的引用,也就是一直保存著當(dāng)前i的值。所以循環(huán)執(zhí)行完畢后點擊每個li,返回的匿名函數(shù)執(zhí)行彈出各自保存的a的引用的值。
                            
查看完整回答
反對 回復(fù) 2019-04-21
?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗 獲得超10個贊

簡單來說:利用閉包的特性把每一個i的值都存儲在內(nèi)存中。因為當(dāng)點擊時for循環(huán)已經(jīng)結(jié)束,所以會彈出最后一個i的值。
詳細(xì)可以看看:詳解js閉包
                            
查看完整回答
反對 回復(fù) 2019-04-21
  • 2 回答
  • 0 關(guān)注
  • 327 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號