字符串似乎没有按值传递

时间:2011-09-05 08:03:26

标签: javascript

我使用以下函数将某个类的所有成员绑定到更改当前页面的函数。继承人的职责:

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>

1 个答案:

答案 0 :(得分:3)

Javascript初学者的头号错误。您错过了绑定到onclick处理程序的匿名函数,关闭父上下文。由于来自同一父上下文的所有闭包共享相同的范围链,所有这些函数都将引用传递到divIdToBind的最后一个值。

要解决该问题,最常见的解决方法是创建另一个函数(-context):

menuItems[index].onclick = (function(id) {
    return function() {
        fja.menu.changeActivePage(id);
    };
}(divIdToBind));

现在我们创建另一个立即执行的函数。我们将它传递给divIdToBind的值,它所做的只是返回另一个函数(只是为了创建一个新的上下文)