Javascript 传递给函数的参数错误
我有以下代码,它将一个Javascript 传递给函数的参数错误,javascript,Javascript,我有以下代码,它将一个onmouseover事件添加到bulletonload for (var i = 0; i <= 3; i++) { document.getElementById('menu').getElementsByTagName('li')[i].onmouseover = function () { addBarOnHover(i); }; } 调用函数时,我不断得到错误: document.getElementById(“菜单”).getElementsBy
onmouseover
事件添加到bulletonload
for (var i = 0; i <= 3; i++) {
document.getElementById('menu').getElementsByTagName('li')[i].onmouseover = function () { addBarOnHover(i); };
}
调用函数时,我不断得到错误:
document.getElementById(“菜单”).getElementsByTagName(“li”)[node]是
未定义”
让我感到困惑的是,我在addBarOnHover
函数中添加了一条alert(node)语句,以查看参数的值。警报称传递的参数值为4。我不确定我设置的循环怎么会发生这种情况
任何帮助都将不胜感激。
i
是作为引用传递的(而不是通过值),因此一旦调用了onmouseover
回调,i
的值已经变为4
您必须使用另一个函数创建回调函数:
var menu = document.getElementById('menu');
var items = menu.getElementsByTagName('li');
for (var i = 0; i <= 3; i++) {
items[i].onmouseover = (function(i) {
return function() {
addBarOnHover(i);
};
})(i);
}
var createCallback = function(i) {
return function() {
addBarOnHover(i);
};
};
for (var i = 0; i <= 3; i++) {
items[i].onmouseover = createCallback(i);
}
var menu=document.getElementById('menu');
var items=menu.getElementsByTagName('li');
对于(var i=0;ii
正在作为引用(而不是通过值)传递,因此一旦调用了onmouseover
回调,i
的值已经变为4
您必须使用另一个函数创建回调函数:
var menu = document.getElementById('menu');
var items = menu.getElementsByTagName('li');
for (var i = 0; i <= 3; i++) {
items[i].onmouseover = (function(i) {
return function() {
addBarOnHover(i);
};
})(i);
}
var createCallback = function(i) {
return function() {
addBarOnHover(i);
};
};
for (var i = 0; i <= 3; i++) {
items[i].onmouseover = createCallback(i);
}
var menu=document.getElementById('menu');
var items=menu.getElementsByTagName('li');
for(var i=0;i关闭迭代变量时,这是一个常见问题。将for
正文包装在一个额外的方法中,以捕获迭代变量的值:
for (var i = 0; i <= 3; i++) {
(function(i){ //here
document.getElementById('menu').getElementsByTagName('li')[i].onmouseover = function () { addBarOnHover(i); };
})(i); //here
}
在不捕获迭代变量的情况下,当它最终用于匿名处理程序时,i
的值已更改为4
。外部作用域中只有一个i
,在处理程序的所有实例之间共享。如果通过匿名函数捕获该值,则该函数的参数而是使用。关闭迭代变量时,这是一个常见问题。将
的正文包装在一个额外的方法中,以捕获迭代变量的值:
for (var i = 0; i <= 3; i++) {
(function(i){ //here
document.getElementById('menu').getElementsByTagName('li')[i].onmouseover = function () { addBarOnHover(i); };
})(i); //here
}
在不捕获迭代变量的情况下,当它最终用于匿名处理程序时,i
的值已更改为4
。外部作用域中只有一个i
,在处理程序的所有实例之间共享。如果通过匿名函数捕获该值,则该函数的参数改为使用。+1作为解释,但我认为此模式不太可读。@JanDvorak:我认为我的编辑会解决这个问题。我有一种感觉,它可能会遇到与原始代码相同的问题。我仍然喜欢无返回版本。它较短(通过一个关键字),并且可以升级为通用模式(请注意,如果在同一个循环中创建多个处理程序,则无返回版本将重用捕获作用域,而此解决方案将为每个处理程序创建一个作用域)@JanDvorak:嗯。我认为返回
是必要的。所以你所需要做的就是将I
传递到另一个作用域?看到我的答案了吗。我在一个讨论“立即调用函数表达式”的博客上看到过这种模式s、 无需返回任何内容-只需使用IIFE的参数捕获值即可。+1作为解释,但我认为这种模式可读性不强。@JanDvorak:我认为我的编辑可以解决这个问题。我感觉它可能会遇到与原始代码相同的问题。我仍然更喜欢不返回的版本。它比较短(通过一个关键字)并可以将其升级为公共模式(注意,如果在同一个循环中创建多个处理程序,则无返回版本将重用捕获范围,而此解决方案将为每个处理程序创建一个范围)@JanDvorak:嗯。我认为返回
是必要的。所以你所需要做的就是将I
传递到另一个作用域?看到我的答案了吗。我在一个讨论“立即调用函数表达式”的博客上看到过这种模式s、 无需返回任何内容-只需使用参数捕获IIFE的值。我不明白。这是如何发生的/?@SomeshMukherjee这是因为在匿名处理程序中最终使用时,I
的值已更改为4
。外部范围中只有一个I
,由处理程序的所有实例。如果您通过匿名函数捕获该值,则使用该函数的参数。感谢您的解释well@Somesh:将变量视为指向内存的指针。在闭包中,只要有该指针,值就会同时更改。当调用函数并向其传递值时,然后生成该值的副本。我不明白。这是如何发生的/?@SomeshMukherjee,这是因为当它最终用于匿名处理程序时,I
的值已更改为4
。外部作用域中只有一个I
,在处理程序的所有实例之间共享。如果捕获到v通过匿名函数进行赋值,然后改为使用该函数的参数well@Somesh:将变量视为指向内存的指针。在闭包中,只要有该指针,值就会同时更改。当调用函数并向其传递值时,就会生成该值的副本。可能可能的副本的副本