您在这里遇到的问题是变量item
随着每个循环而变化。当您item
稍后引用时,将使用它保存的最后一个值。您可以使用称为闭包的技术(本质上是一个返回函数的函数)来快速地以不同的方式作用域变量。
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"
);
}
旁注 - 我看到你在这里有 jQuery。它有一个$.each()
可以与数组一起使用的辅助函数,并且可以是简单的 for/each 循环的快捷方式。由于此调用中作用域的工作方式 - 您不需要使用闭包,因为“item”在调用时已经是函数的参数,而不是存储在var
父函数的作用域中,就像在您的示例中一样.
$.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);
});
});