在具有Javascript闭包的回调函数中,如何访问全局变量

时间:2014-05-07 14:37:16

标签: javascript html closures

很简单: 我需要使用函数注册一个事件属性。但是为了将参数传递给函数,我创建了一个闭包。

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的新值而不是第一次启动?

2 个答案:

答案 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++)

JSFIDDLE

每次点击都会输出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);
    }