js回撥的一個疑惑
阿新 • • 發佈:2019-02-13
昨天,在用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);});
});
關於閉包問題,有時間再好好深入瞭解一下