Jquery范围问题

Fra*_*kie 2 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]);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

救命!!!!

弗兰基

Ray*_*nos 8

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

您需要在匿名函数中创建local 的当前值.i.click

JavaScript只有函数范围.因此,如果您不进行i本地化,那么每当您按下单击时,值i都是当前值,在这种情况下是menuItems.length - 1.

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

JSLint的

让我们过度复杂化代码并满足jslint.

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

for (var i=0; i < menuItems.length; i++) {
    wrapper(i);
}
Run Code Online (Sandbox Code Playgroud)