Vấn đề bạn có ở đây là rằng item
thay đổi biến với mỗi vòng lặp. Khi bạn đang tham chiếu item
tại một số điểm sau này, giá trị cuối cùng mà nó được giữ sẽ được sử dụng. Bạn có thể sử dụng một kỹ thuật được gọi là closure (về bản chất là một hàm trả về một hàm) để nhanh chóng phạm vi biến khác nhau.
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"
);
}
Lưu ý phụ - Tôi thấy bạn có jQuery ở đây. Nó có một hàm trợ giúp $.each()
có thể được sử dụng với các mảng và có thể là một phím tắt cho đơn giản cho/mỗi vòng lặp. Do cách phạm vi hoạt động trong cuộc gọi này - bạn sẽ không cần sử dụng lệnh đóng vì "mục" đã là tham số của hàm khi được gọi, không được lưu trữ trong phạm vi var
trong phạm vi chức năng của cha mẹ, như đã đúng trong thí dụ.
$.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);
});
});
Tìm thấy một giải pháp thanh lịch hơn cho bạn sau khi thực tế - hãy kiểm tra lợi thế của việc sử dụng '$ .each()' – gnarf
Cảm ơn bạn! Tôi chỉ dành một thời gian cố gắng tạo ra một đóng cửa để sử dụng một biến địa phương bên trong gọi lại nhấp chuột của tôi. Phần khó khăn cho tôi loại bỏ các tham số từ hàm được trả về. – Sam