微小的javascript封闭问题

时间:2011-08-30 14:56:23

标签: javascript closures

for(var i=0,len=btns.length;i<len;i++){
    (function(){
     btns[i].addEventListener('click',function(e){
        console.log(i)
         },false)
    })(i)}}

大家好,我最近在学习Javascript。在上面的代码中,为了理解一点闭包,你知道,只需设置3个按钮来记录3个不同的i

不幸的是,它失败了。我知道我没有得到关闭点。为什么?我立即执行该函数,以便监听器的回调函数中的i不会共享相同的i

希望有人能帮忙〜

2 个答案:

答案 0 :(得分:4)

你将i变量传递给函数,但是函数忽略了参数,只是绑定到函数内部的i是与外部变量相同的变量(因为你指定了一个空的正式变量)参数列表)。

因此,在您有机会按下任何按钮之前,您的循环已完成并增加了i所有闭包之间共享的单3

使用function()重写function(i),它将有更好的工作机会。

答案 1 :(得分:1)

尝试在实际为函数声明参数的位置,以便i在函数内获取本地定义:

for(var i = 0, len = btns.length; i < len; i++) {
    (function(i){
        btns[i].addEventListener('click',function(e){
            console.log(i);
        },false);
    })(i);
}

如上所述,您将i作为参数传递给函数,但实际上并未将其定义为参数,因此未使用传递的参数。这就是为什么使用相同名称是一个坏主意的一个原因,因为这些类型的错误不会导致javascript错误。我更倾向于使用内部变量的不同名称,因此两者之间不会产生混淆:

for(var i = 0, len = btns.length; i < len; i++) {
    (function(loopVar){
        btns[loopVar].addEventListener('click',function(e){
            console.log(loopVar);
        },false);
    })(i);
}

您可以在此处查看此工作:http://jsfiddle.net/jfriend00/Hb5t3/