話不多說了。
先來看兩段程式碼:
>var elems = document.getElementsByTagName('a');
for (var i = 0; i
alert(i);
elemsms [i].addEventListener('click', function (e) {
e.preventDefault();
alert('I am link #' i);
}, 'false');
}
複製程式碼
程式碼如下:
程式碼如下:
程式碼如下:
程式碼如下:
var elems = document.getElementsByTagName('a');
for (var i = 0; i
(function(index){
elems[i].addEventListener('click', function (e) {
e.preventDefault();
alert('I am link #' index);
}, 'false' );
})(i);
}
HTML 代碼如下:
複製代碼
程式碼如下:
a
a 你可以想像下,前後兩段script程式碼的效果。
如果你能看出來效果的區別,那麼恭喜你。至少我思考了很久,才明白裡面的玄妙。
是的。你沒有看錯,這裡的第一段程式碼,無論你點擊哪一個鏈接,輸出的都是I am link # 8.
第二段程式碼,才是你真正想要的結果,那麼為什麼呢。
看下面的程式碼:
複製程式碼
程式碼如下:
程式碼如下: var🎜> elems = document.getElementsByTagName('a');
for (var i = 0; i
alert(i);
elems[i ].addEventListener('click', function (e) {
e.preventDefault();
alert('I am link #' i);
//注意這裡的回呼函數只有的觸發的時候才會啟動
//一樣,這裡的i的值也一樣在循環結束的時候也變化了
}, 'false');
//原因在於
/ /這裡的elems[i] 雖然是引用的元素
//但是回調函數中的i 已經在循環結束後
//變成了8(如果elems 的長度是8 的話)
}
複製代碼
代碼如下: 代碼如下: var ('a'); for (var i = 0; i (function(index){ elems[i].addEventListener( 'click', function (e) { e.preventDefault(); alert('I am link #' index); }, 'false'); })(i) ; //而這裡的則不一樣//雖然循環結束後i 的值變成了8 //但是在封裝在閉包內的index 確實一直被locked 住的//一直保存在記憶體中。 //準確的說 應該是整個函數都lock在內存中. } 這裡可能需要一些javascript閉包的知識。 以上程式碼,想了很久,記錄下來,以防止忘記。