Phil's answer提供了一個很好的解決方案特定的您發佈的代碼(+1),但並未解釋您的原始代碼存在什麼問題。
的問題是,事件處理倒閉得到持久參考到index
變量,而不是複製它如在創建時的。所以他們都看到index
的最終值(divs.length
)。例如,該超時發生時這個代碼
for (index = 0; index < 4; ++index) {
setTimeout(function() {
console.log(index);
}, 100);
}
...將記錄 「4」 的四倍,而不是 「0」, 「1」, 「2」 和 「3」。
要在通常情況下要確保您的處理程序關閉了特定值,請使用工廠函數爲您生成事件處理程序函數,其中事件處理函數關閉通過您提供工廠的參數函數,而不是循環變量:
for(index=0; index<divs.length; index++) {
divs[index].addEventListener("click", createHandler(divs[index], true); //capture click event
}
function createHandler(div) {
return function(){
console.log(div.getAttribute("id"));
};
}
在那裏,事件處理程序關閉了div
,這不會改變。
閉包是JavaScript中最強大的功能之一。一旦你明白了他們的工作方式(而且他們實際上比人們想象的要簡單得多),你可以使用它們取得非常好的效果。更多:Closures are not complicated
閱讀關於JavaScript閉包,並編輯您的代碼。這是一個可變範圍問題。 – DhruvPathak 2012-01-16 05:40:10