這里有這個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的引用的值。