ich würde jetzt eher sagen, dass Closures mein Problem erst verursacht haben und sehe nicht, wie ich es darüber lösen könnte? Hättest Du lust die Idee auszuführen? :)
indem du bei jedem schleifendurchlauf eine anonyme funktion erzeugst (per funktionsausdruck), diese direkt ausführst und dabei den schleifenzähler als parameter übergibst
darin eine weitere closure notierst (die event-handler-funkton), die den schleifenzähler einschließt
for (var i = 0; i < 5; i++) {
(function (i) {
...
element.onclick = function () {
alert("Das korrekte i:" + i);
};
})(i);
}
die closure sorgt dafür, dass das variablenobjekt der jeweiligen äußeren (anonymen, nicht gespeicherten, nur einmal ausgeführten) funktion erhalten bleibt. das liegt in der scope chain über dem variablenobjekt der event-handler-funktion, dort wird dann die variable i gefunden
das ist aber ziemlich gefrickelt und nicht so performant (viele erzeugte funktionen und funktionsaufrufe, massig variablenobjekte, die im speicher verbleiben), es gibt einfachere und robustere methoden
weiteres findet sich im archiv zu den stichwörtern closures und schleifen