微小的JavaScript闭包问题
tiny javascript closure question
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/
相关文章:
- JavaScript + mocha:可能是在 for 循环中声明函数的闭包问题
- Javascript;promise中存在Q-闭包问题
- 我在循环中遇到闭包问题,但我仍然使用单独的功能
- 创建带有回调的动态 JSON 数组(内部闭包问题)
- javascript中奇怪的闭包问题
- 简单的Javascript闭包问题
- 如何解决angularjs中的闭包问题
- 数组中jQuery元素的常见JavaScript闭包问题
- 试图理解js中的闭包问题
- 如何通过闭包问题来增加全局变量
- 循环(事件)中的闭包问题
- 不能将事件传递给addEventListener:闭包问题
- 可能是另一个Javascript闭包问题
- JavaScript闭包问题
- 为已发出的事件创建侦听器时的闭包问题
- 关于在循环中创建动态元素的JavaScript闭包问题
- 类定义中的闭包问题
- 微小的JavaScript闭包问题
- Javascript闭包问题
- StateProvider动态生成模板url -闭包问题