javascript中循环加载监听事件的闭包问题
2013-12-10 11:40
513 查看
Javascript中的闭包跟自身带来的强大的功能,但是这仅仅是限于知道怎么用它的人,如果不懂其原理,那么自己写的代码就会经常遇到闭包所影响的变量作用域问题,下面说说我个人遇到的一个问题,也是一般人都会遇到的问题吧,就是给DOM中的元素循环加载监听事件的时候,i变量值的问题。
看代码:
可以发现上面弹出的结果都是aDivs的长度,而不是预期的一些从小到大的数,这里就是因为闭包的问题影响的i的取值。解决办法有下面两个:
第一个方式很简单,如下:
第二种方式如下:
第一种方式使用给对象添加变量的方式解决了问题,就是每次把i保存下来作为对象的一个属性;第二种方式就是利用闭包解决了闭包本身带来的问题。
看代码:
var aDivs = document.getElementsByTagName('div');//获取多个div集合 for(var i=0; i<aDivs.length; i++){ aDivs[i].onclick=function(){ alert(i); } }
可以发现上面弹出的结果都是aDivs的长度,而不是预期的一些从小到大的数,这里就是因为闭包的问题影响的i的取值。解决办法有下面两个:
第一个方式很简单,如下:
var aDivs = document.getElementsByTagName('div');//获取多个div集合 for(var i=0; i<aDivs.length; i++){ aDivs[i].index = i; aDivs[i].onclick=function(){ alert(this.index); } }
第二种方式如下:
var aDivs = document.getElementsByTagName('div');//获取多个div集合 for(var i=0; i<aDivs.length; i++){ add(i); } function add(i){ aDivs[i].onclick=function(){ alert(i); } }
第一种方式使用给对象添加变量的方式解决了问题,就是每次把i保存下来作为对象的一个属性;第二种方式就是利用闭包解决了闭包本身带来的问题。
相关文章推荐
- JavaScript闭包-循环添加onfocus事件出问题
- javascript事件概念和事件监听,ie特殊和标准DOM,页面先加载
- javascript监听iframe加载完成事件
- 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性
- js的一个有意思的小题,闭包解决getElementByTagName的for循环绑定事件错误问题
- javascript中的闭包循环变量只能取最后一个值问题
- 多个onclick在一起只执行最后一个的问题解,其它是事件处理引发的问题 (JavaScript的监听事件函数attachEvent和addEventListener)
- 深入理解JavaScript的闭包特性 如何给循环中的对象添加事件
- 深入理解JavaScript的闭包特性 如何给循环中的对象添加事件
- JavaScript的闭包问题(闭包解决引用循环变量的问题)
- 深入理解JavaScript的闭包特性 如何给循环中的对象添加事件(转载)
- javascript页面加载与事件监听函数
- javascript中循环绑定监听事件的解决方案
- Javascript利用闭包循环绑定事件
- 深入理解JavaScript的闭包特性 如何给循环中的对象添加事件
- javascript循环变量注册dom事件 之强大的闭包
- javascript事件触发、监听和其游览器兼容问题
- Javascript利用闭包循环绑定事件
- [ViewPager]的使用和事件监听,[Xutils中加载的问题]
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件