Это одна из хитрых вещей с закрытием. Вы создаете эти обработчики событий с закрытием более entry
. Все они имеют доступ к этой переменной, этой точной переменной. Следовательно, как только эти события срабатывают, они получают только последнее значение, установленное для входа. Вы должны сломать закрытие. Вот один из способов.
function addClickHandlers() {
var entries = [{id: 1},{id: 2},{id: 3}];
var i = entries.length;
while (i--) {
var entry = entries[i];
document.getElementById(entry.id).onclick = getClickHandler(entry);
}
}
function getClickHandler(entry) {
return function() {
console.log("this.id: " + this.id);
console.log("entry.id: " + entry.id);
};
}
Примечание: я изменил ваш цикл for на некоторое время только потому, что это самый быстрый способ сделать цикл в javascript, когда порядок не важен, и я думаю, что он гладкий.
Добавлено для полноты
Есть несколько других методов, разработанных для решения этой ситуации. Я считаю, что я использую их все время.
В Ext есть createDelegate
myhandler.createDelegate(scope, [arguments], [appendArgs]);
Для JavaScript 1.8.5 есть Function.prototype.bind
myhandler.bind(scope, arguments)
Написание Function.prototype.bind довольно просто ( поднято отсюда )
Function.prototype.bind = function(self, var_args) {
var thisFunc = this;
var leftArgs = Array.slice(arguments, 1);
return function(var_args) {
var args = leftArgs.concat(Array.slice(arguments, 0));
return thisFunc.apply(self, args);
};
};