JQuery 遍历数组以某种方式通过引用传递

JQuery loop through array somehow passing by reference

所以我有一个非常简单的功能不起作用。它应该遍历导航名称数组,并且 link 每个导航按钮都使用导航名称作为参数调用另一个函数。出于某种原因,它正在 linking 每个按钮来调用以最后一个导航名称作为参数的函数。因此,无论您单击 'Gigs'、'Music'、'Videos' 等,它都会调用 getPage('Contact')。我在想它以某种方式通过引用传递,但我不知道如何或为什么。

我在顶部实例化数组:

var navLinks = new Array('Blog', 'Gigs', 'Music', 'Videos', 'Photos', 'Band', 'Contact');

然后 运行 像这样通过它:

var foo;

// Add nav links
for(var i = 0; i < navLinks.length; i++) {

    $('#' + navLinks[i] + 'Nav');

    foo = "'" + navLinks[i] + "'";

    if( (page != 'Videos' && page != 'Photos') && (curPage != 'Videos' && curPage != 'Photos') )

        $('#' + navLinks[i] + 'Nav').click(function() { getPage( foo, 0) } );

    else

        $('#' + navLinks[i] + 'Nav').click(function() { getPage( foo, 1) } ); 

    $('#' + navLinks[i] + 'Nav').css('cursor', 'pointer');

} // End add nav links

我在试验时把 foo 扔进去了。真正令人困惑的部分是它 link 每个元素,所以它遍历所有选项;当我发出警报以在每次迭代中检查 foo 时,它会针对所有单个选项发出警报。我现在很沮丧,谢谢你的帮助。

当您创建回调函数 function() { getPage( foo, 1) } 时,您 关闭 foo 变量,并且 foo 随着您 运行 您的 for 循环,因此在调用回调时,foo 的值是它在循环结束时的最后一个值。

您需要通过调用一个函数来创建一个新的变量上下文。例如:

var foo;

function addHandler(i, foo, x){
   $('#' + navLinks[i] + 'Nav').click(function() { getPage( foo, x) });
}
// Add nav links
for(var i = 0; i < navLinks.length; i++) {
    $('#' + navLinks[i] + 'Nav');
    foo = "'" + navLinks[i] + "'";
    var x = (page != 'Videos' && page != 'Photos') && (curPage != 'Videos' && curPage != 'Photos') 
        ? 0 
        : 1
    addHandler(i, foo, x);

    $('#' + navLinks[i] + 'Nav').css('cursor', 'pointer');

} // End add nav links

因为调用 addHandler 会捕获其参数的 而不是捕获变量本身,所以 addHandler 每次调用时都会捕获不同的变量。