很简单: 我需要使用函数注册一个事件属性。但是为了将参数传递给函数,我创建了一个闭包。
var x=0
function foo(bar1,bar2){
return function (){
alert (bar1+bar2);
x++;
}
}
for (var i=0;i<document.getElementsByTagName("div").length;i++) {
document.getElementsByTagName("div")[i].onclick=foo(x,i)
}
由于我有5个div
个元素,如果我从上到下点击所有div,我认为它应该像这样警告:
0 2 4 6 8
但输出:
0 1 2 3 4
似乎每次foo(x,i)
,x
都等于0
。如何让foo()
访问x
的新值而不是第一次启动?
答案 0 :(得分:1)
您只在内部函数中递增x
。只有在单击元素时才会调用此函数。因此,在调用foo
时,x
始终为0.只有在点击某些内容时才会递增,此时bar1
的值已经设置(到0)。
你可以这样做:
var x=0
function foo(bar1){
return function (){
alert (bar1+x);
x++;
}
}
for (var i=0;i<document.getElementsByTagName("div").length;i++) {
document.getElementsByTagName("div")[i].onclick=foo(i)
}
通过这种方式,您将始终使用x
的当前值,而不是调用foo
时的值。
答案 1 :(得分:0)
您需要增加x
,增加i
。因为在每次迭代时x
仍为零,因此您获得的值0,1,2,3,4
实际上是i
的值。
在您的代码中,您在每次迭代时将值0传递给变量bar1
,并且x
增量的唯一时间是在您不在迭代期间单击按钮之后,因此如果您放置在此警报前{x}的另一个警告alert (bar1+bar2);
你明白我的意思。
最后要在每次迭代时增加x
,你必须在循环中明确地执行它。像这样:
;i++, x++)
每次点击都会输出0,2,4,6,8
而不会增加x。
var x = 0,
div = document.getElementsByTagName("div");
function foo(b1, b2){
return function () {
alert (b1 + b2);
}
}
for (var i = 0; i< div.length; i++, x++) {
div[i].onclick = foo(x, i);
}