1. 程式人生 > >js回撥的一個疑惑

js回撥的一個疑惑

昨天,在用js時遇到了一個問題,程式碼如下

$(document).ready(function(){ 
     for(var i = 0 ; i < 5; i++){ 
          $("#button"+i).bind("click",function(){ 
              alert(i); 
          }); 
     } 
});

很簡單的一個bind,結果每個button的click都是alert出5。當時很疑惑,為什麼不是0,1,2,3,4?

然後我就去問答問了一下,結果有位小夥伴就跟我說這是js閉包問題,然後我又去看了一下js閉包

請看這篇博文
js中的閉包之我理解
,特別是裡面的一句“閉包中所記錄的自由變數,只是對這個變數的一個引用,而非變數的值,當這個變數被改變了,閉包裡獲取到的變數值,也會被改變.”,這就解決了我當前的疑惑。

然後是針對上面問題的解決思路,

思路1    在外部定義一個返回值為function的方法,然後再bind裡呼叫外部定義的方法,並將i傳過去

for(var i = 0 ; i < 5; i++){ 
          $("#button"+i).bind("click", callback(i)); 
     } 

function callback(i){
    return function(){
        alert(i);
    }
}

思路2(上面那位小夥伴提供),放棄id選擇器,把id當成一個屬性,然後利用startWith過濾器選擇到這些東西,然後each列舉通過解析id的具體值來完成事件的繫結。

$("*[id^='b']).each(function(index, data){
<pre>    var i = $(data).id().substring(1);
    $(data).bind("click", function(){alert(i);});
});
關於閉包問題,有時間再好好深入瞭解一下