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

时间:2015-04-10 19:17:38

标签: jquery arrays loops for-loop pass-by-reference

所以我有一个非常简单的功能。它应该遍历一组导航名称,并使用导航名称作为参数链接每个导航按钮和另一个函数的调用。由于某种原因,它链接每个按钮以使用最后一个导航名称作为参数调用该函数。因此,无论您点击“演出”,“音乐”,“视频”等,它都会调用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。真正令人困惑的部分是它确实链接了每个元素,因此它会经历所有选项;当我在每次迭代中发出警告来检查foo时,它会提醒所有个别选项。我感到非常沮丧,谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

当您创建回调函数function() { getPage( foo, 1) }时,您关闭 foo变量,foo在运行for时发生变化1}}循环,所以在调用回调时,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每次调用时都会捕获一个不同的变量。