Jquery范围问题

时间:2011-03-11 00:59:40

标签: javascript jquery scope

我无法弄清楚这个范围问题:

var menuLinks = new Array("about.php", "contact.php");
function setClickListeners()
{
    for(var i=0; i<menuItems.length; i++)
    {
        $("#" + menuItems[i]).click( function () {
            window.alert(menuLinks[i]);
        });
    }
}

注意:menuItems和menuLink的长度相同。这个代码被剥离,以便更容易理解。

单击项目时此代码的结果是警报“未定义”。它应该是来自menuLinks的数据。

帮助!

弗兰克

2 个答案:

答案 0 :(得分:8)

for (var i=0; i < menuItems.length; i++) {
    (function(i) {
         $("#"+menuItems[i]).click(function() {
              alert(menuLinks[i]);
         });
    }(i));
}

您需要在i中为您的匿名函数设置.click本地的当前值。

JavaScript只有函数范围。因此,如果您没有将i设为本地,那么每当您按下时,i的值就是当前值,在这种情况下为menuItems.length - 1

您在上面做的是创建一个新的功能范围并将i的值传递给它,以便i的当前值在该功能范围内保持不变。这样你的点击函数就会从闭包中获取i的常量值。

<强>的JSLint

让代码复杂化并满足jslint。

var wrapper = function(i) {
    $("#"+menuItems[i]).click(function() {
         alert(menuLinks[i]);
    });
};

for (var i=0; i < menuItems.length; i++) {
    wrapper(i);
}

答案 1 :(得分:1)

更干净的代码:

var menuLinks = new Array("about.php", "contact.php");
function setClickListeners()
{
    $.each(menuLinks, function(i, element)
    {
        $("#" + menuItems[i]).click( function (e) {
            alert(menuItems[i]);
            e.preventDefault();
        });
    }
}