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
每次调用时都会捕获不同的变量。
所以我有一个非常简单的功能不起作用。它应该遍历导航名称数组,并且 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
每次调用时都会捕获不同的变量。