所以我有一个非常简单的功能。它应该遍历一组导航名称,并使用导航名称作为参数链接每个导航按钮和另一个函数的调用。由于某种原因,它链接每个按钮以使用最后一个导航名称作为参数调用该函数。因此,无论您点击“演出”,“音乐”,“视频”等,它都会调用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时,它会提醒所有个别选项。我感到非常沮丧,谢谢你的帮助。
答案 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
每次调用时都会捕获一个不同的变量。