微小的JavaScript闭包问题

tiny javascript closure question

本文关键字:闭包 问题 JavaScript      更新时间:2023-09-26
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

希望有人能帮忙~

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

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

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

尝试一下,你实际为函数声明了一个参数,以便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/