JavaScript 在for循環中綁定事件

問題原因:

寫了一段這樣的代碼

例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可以看出這一點,無論點擊哪個按鈕之後提示的數字都會自增一,而且兩者的自增是連續的而不是獨立的。

在第二個例子中,所有的子函數則是使用了父函數傳入的參數,子函數的子函數則是使用了這個參數,由於參數傳遞對於數字來說是傳值,所以每個子函數的參數則是全新的拷貝之後的數字對象。



發佈了51 篇原創文章 · 獲贊 21 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章