2012年4月26日

【JavaScript】Closure in for loop



我們通常會遇到以下情況

假設有個簡單網頁,所包含的元件如下

<ul>
    <li>123</li>
    <li>456</li>
</ul>

我們要給每個 li 加上一個 onclick 事件

滑鼠點擊後會 alert 順序的編號

為了讓程式聰明點

我們通常會使用 getElementsByTagName

和 foor loop 來 add event

例如:


var list = document.getElementsByTagName("li");
for( var i=0; i<list.length; i++){
list[i].onclick = function(){
alert(i);
}
}

但是這樣會發現一個嚴重的問題

每個 li alert的數字都一樣是2

為什麼?

因為當滑鼠按下時,做的動作是: alert(i);

而當時的 i 早就跑完迴圈變成 2 了

所以應該要這樣寫:


var list = document.getElementsByTagName("li");
for( var i=0; i<list.length; i++){
list[i].onclick = (function(index){
return function(){
alert(index);
}
})(i);
}

把重要的那部分拿出來研究一下:


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

最外面的 ()(i) 的意思是執行裡面的 anonymous function

而裡面的 anonymous function 又 return 一個 function

return 的 function 做的事情是 alert(index)

index 又是  anonymous function 的 parameter

就是一個不被外部干擾的 Local variable

所以可以保證 alert 是我們想要的數字


沒有留言:

張貼留言