我使用以下函数将某个类的所有成员绑定到更改当前页面的函数。继承人的职责:
function _bind_menu_items() {
var menuItems = fja.getElementsByClass("menuItem"),
index,
elementID,
divIdToBind;
for (index in menuItems) {
elementID = menuItems[index].id;
divIdToBind = elementID.replace("Item", "");
menuItems[index].onclick = function() {
fja.menu.changeActivePage(divIdToBind);
};
}
}
我已经检查过所有内容都按预期工作,直到onclick属性的实际分配。我得到的错误是属于menuItem类的每个div似乎都调用相同的onclick函数......好像divIdToBind字符串对于分配的每个onclick完全相同...我该如何解决这个问题? / p>
答案 0 :(得分:3)
Javascript初学者的头号错误。您错过了绑定到onclick
处理程序的匿名函数,关闭其父上下文。由于来自同一父上下文的所有闭包共享相同的范围链,所有这些函数都将引用传递到divIdToBind
的最后一个值。
要解决该问题,最常见的解决方法是创建另一个函数(-context):
menuItems[index].onclick = (function(id) {
return function() {
fja.menu.changeActivePage(id);
};
}(divIdToBind));
现在我们创建另一个立即执行的函数。我们将它传递给divIdToBind
的值,它所做的只是返回另一个函数(只是为了创建一个新的上下文)