Das Problem, das Sie hier haben, ist, dass die variablen item
ändert sich mit jeder Schleife. Wenn Sie zu einem späteren Zeitpunkt auf item
verweisen, wird der letzte Wert verwendet, den es enthielt. Sie können eine Technik namens closure (im Wesentlichen eine Funktion, die eine Funktion zurückgibt) verwenden, um die Variable schnell anders zu definieren.
for (var i in this.items) {
var item = this.items[i];
$("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"/images/showcase/icon-"+item.id+".png\" /></li>");
$("#showcasebutton_"+item.id).click(
// create an anonymous function that will scope "item"
(function(item) {
// that returns our function
return function() {
alert(item.id);
self.switchto(item.id);
};
})(item) // immediately call it with "item"
);
}
Eine Randnotiz - ich sehe, dass Sie hier jQuery haben. Es hat eine Hilfsfunktion $.each()
, die mit Arrays verwendet werden kann, und kann eine Abkürzung für einfache for/jede Schleifen sein. Wegen der Art, wie das Scoping in diesem Aufruf funktioniert, brauchen Sie kein Closure zu verwenden, da "item" bereits der Parameter der Funktion ist, als es in einem var
im Bereich der übergeordneten Funktion aufgerufen wurde, wie in Ihrem Beispiel.
$.each(this.items,function(i, item) {
$("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"/images/showcase/icon-"+item.id+".png\" /></li>");
$("#showcasebutton_"+item.id).click(function() {
alert(item.id);
self.switchto(item.id);
});
});
Finden Sie eine elegante Lösung für Sie nach der Tat - überprüfen Sie den Vorteil der Verwendung von '$ .each()' – gnarf
Vielen Dank! Ich habe gerade eine Weile damit verbracht, eine Schließung zu erstellen, um eine lokale Variable in meinem Klick-Callback zu verwenden. Der schwierige Teil für mich, die Parameter von der Funktion zu entfernen, die zurückgebracht wird. – Sam