Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 传递给函数的参数错误_Javascript - Fatal编程技术网

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
事件添加到bullet
onload

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;i
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');

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:将变量视为指向内存的指针。在闭包中,只要有该指针,值就会同时更改。当调用函数并向其传递值时,就会生成该值的副本。可能可能的副本的副本