問題原因:
寫了一段這樣的代碼
例1
for(var i=0;i<10;i++){
btns[i].οnclick=function(){
alert(i);
}
}
原意是每個按鈕按一下彈出一個彈框來顯示它的標號。
結果每次都是顯示最後一個按鈕的標號。
找原因找原因!
解決方法:
後來在網上找到了這個
例2
for(var i=0;i<10;i++){
btns[i].οnclick=(function(i){
return function(){alert(i)}
})(i)
}
這樣一執行,果然就出現了預期的結果。
爲什麼?
例3
for(var i = 0; i < 2; i++){
btns[i].onclick = function (){
alert(i);
i = i + 1;
}
}
網上很多資料提到了閉包,然後說了好多東西來說明什麼是閉包,有一個通俗的講法是子函數中使用了父函數的私有變量。
第一種情況其實也是使用了閉包,只不過所有的子函數共用了父函數的一個私有變量,通過例3可以看出這一點,無論點擊哪個按鈕之後提示的數字都會自增一,而且兩者的自增是連續的而不是獨立的。
在第二個例子中,所有的子函數則是使用了父函數傳入的參數,子函數的子函數則是使用了這個參數,由於參數傳遞對於數字來說是傳值,所以每個子函數的參數則是全新的拷貝之後的數字對象。