用立即执行函数 解决闭包问题
2014-07-06 17:10
417 查看
<div>DIV 0</div> <div>DIV 1</div> <script> var div = document.getElementsByTagName("div"); for(var i = 0; i < div.length; i++){ div[i].addEventListener("click",function(){ alert("div # " + i + " was clicked!") }); } </script>
当点击DIV 0时,弹出的是以下图所示:
这个就是个经典的闭包问题,由于闭包,addEventListener里面的匿名函数中的变量i一直保持着外部变量i的引用(也就是说无论是匿名函数还是匿名函数外的函数,就要变量i的值变了,都会变) ,所以等循环结束时,i 的值就是最后的值,也就是2。
解决的问题的办法是:加立即执行函数,使得匿名函数内的变量i与外部函数的变量i的引用关系断掉。
<div>DIV 0</div> <div>DIV 1</div> <script> var div = document.getElementsByTagName("div"); var div = document.getElementsByTagName("div"); for(var i = 0; i < div.length; i++){ (function(index){ div[index].addEventListener("click",function(){ alert("div # " + index + " was clicked!") }); })(i); } </script>
此时点击DIV 0 时,就会弹出我们所期望的值。
相关文章推荐
- JavaScript之闭包问题以及立即执行函数
- JavaScript之闭包问题以及立即执行函数
- javascript中运用闭包和自执行函数解决大量的全局变量问题
- 采用自执行的匿名函数解决for循环使用闭包的问题
- javascript中运用闭包和自执行函数解决大量的全局变量问题
- 采用自执行的匿名函数解决for循环使用闭包的问题
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。问题的解决方法!
- Matlab中出现:尝试将SCRIPT SVD作为函数执行:C:\User\lc\...问题的解决方法
- 在sqlserver2000中执行函数出错问题解决
- JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
- 闭包循环执行的问题解决
- Eval函数解决字符串JS在IE下不执行的问题
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。问题的解决方法!
- 函数放到onload里面,在html里面执行函数会报错-----作用域和闭包相关问题
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。问题的解决方法!
- android开发问题(二)解决ScrollView加入后无法执行OnGestureListener的监听函数
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- 解决iphone safari下后退按钮导致函数不执行的问题
- 解决system()函数执行命令弹出dos窗口问题
- js中解决函数中使用外部函数局部变量的问题(闭包问题)