首先看一段代碼:
```
代碼塊
···
然后運(yùn)行一下,當(dāng)時(shí)作為一名天真的js初學(xué)者理所當(dāng)然的認(rèn)為分別點(diǎn)擊不同的額按鈕粘舟,會(huì)分別的打印出0或详、1、2复罐、3、4雄家,然而事與愿為效诅,現(xiàn)實(shí)和理想總是存在差距,點(diǎn)擊不同的按鈕趟济,打印卻都是5乱投,百思不得其解,不科學(xué)扒瓯唷戚炫!
最后百度了一番才恍然大悟,原來(lái)console.log(i)里的i在循環(huán)完成的時(shí)候被賦值成了5媳纬,而每個(gè)按鈕的onclick都被賦值了同一個(gè)function,也就是說(shuō)每個(gè)function里的i指的是同一個(gè)i双肤,i=5施掏,自然每個(gè)點(diǎn)擊都會(huì)打印出5,那么該怎么解決呢茅糜?七芭!
再看接下來(lái)這段代碼:
再運(yùn)行這段代碼,就可以得到你想要的效果蔑赘,但是是為什么呢狸驳?
知道了原因就好辦了,利用閉包把每個(gè)function里的i都變成不同的i就行了缩赛,當(dāng)時(shí)作為一名初學(xué)者還不懂閉包锌历,也是后來(lái)才理解的。
循環(huán)中的function自調(diào)用峦筒,將循環(huán)中的i作為參數(shù)傳入function中究西,此時(shí),function中的i已經(jīng)不是循環(huán)中的i了(這里有點(diǎn)繞物喷,其實(shí)形參i卤材,即function里的i換成什么變量名都行),而是在內(nèi)存中開(kāi)辟了一個(gè)內(nèi)存空間存儲(chǔ)了作為參數(shù)傳進(jìn)來(lái)的i的值峦失,這樣function中的就不會(huì)隨著循環(huán)中的i的值的改變而改變了,就可以打印出你要的結(jié)果了扇丛。