先看一段代碼
可能很多人對這段代碼無法理解,程序的設計者設計的初衷是想給數(shù)組a放置打印下標的function, 可實際執(zhí)行結果是舒裤,數(shù)組a里存放的function打印的不是對應的下標,而全都是21てА鬼雀?!谢床? 無法理解? 不要急厘线,等我一步一步的調試下识腿,可能會對你有所幫助呢
1. 下面這段代碼相信都沒有疑問
2. 這一步
test聲明的時候, 此時i=0,但是調用的時候造壮,i已經變成了1
3. 再加一個函數(shù)test2, 同時再次i++, 函數(shù)內容同樣是打印i, 結果是兩次打印都是2, 因為這兩個函數(shù)中的i是同一個值,并且打印時i的值不是聲明時的值,而是和調用時的值保持一致渡讼。
4. 一樣的, 只是把函數(shù)存進了數(shù)組
5. 然后還是一樣的, 只是放進了循環(huán)中,但現(xiàn)在, 已經無縫過渡到了開頭的那一段
6. ?怎么讓程序按我們期望的方式輸出呢? 一個解決辦法是, 將函數(shù)嵌套在一個匿名函數(shù)里,通過匿名函數(shù)來傳i值
原因是耳璧,通過匿名函數(shù)傳值后成箫,匿名函數(shù)里的v是局部變量,是函數(shù)中非公用的活動對象旨枯,不會受外面i的影響蹬昌,因此能夠將我們期望的下標值打印出來
結論: 其實這就是一個閉包引起的副作用(該閉包沒有外部函數(shù),因為外部函數(shù)不是必需的(是不是可以暫稱此類閉包為開包openure)), 當前函數(shù)的活動對象的活動對象其實就是全局變量對象, 因為沒有外部函數(shù), 這個數(shù)組里的所有函數(shù)共用一個活動對象, 包括a和i, 所有這里的函數(shù)共用一個i, 所以每個函數(shù)里的i值都是最后一個值2。
歡迎指教和探討攀隔! ?www.bonjs.com?
Alex