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
希望有人能帮忙〜
答案 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/