博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS闭包导致循环给按钮添加事件时总是执行最后一个
阅读量:5281 次
发布时间:2019-06-14

本文共 1254 字,大约阅读时间需要 4 分钟。

加入如下脚本代码: 

  1. <script>    
  2. var list_obj = document.getElementsByTagName('li');    
  3. for (var i = 0; i <= list_obj.length; i++) {          
  4.   list_obj[i].onclick = function() {        
  5.     alert(i);        
  6.   }    
  7. }  
  8. </script>    

运行后,奇怪的发现无论点击那个li标签,alert出的都是最后一个的内容,5

 

 

下面做下分析:因为在for循环里面指定给list_obj[i].onclick的事件处理程序,也就是onclick那个匿名函数是在for循环执行完成后(用户单击链接时)才被调用的。而调用时,需要对变量i求值,解析程序首先会在事件处理程序内部查找,但i没有定义。然后,又到方法外部去查找,此时有定义,但i的值是4(只有i大于4才会停止执行for循环)。因此,就会取得该值——这正是闭包(匿名函数)要使用其外部作用域中变量的结果。而且,这也是由于匿名函数本身无法传递参数(故而无法维护自己的作用域)造成的。

 

那现在原因是知道了,如何来避免这种情况呢?

既然已经知道函数调用外部变量的时候就构成了一个闭包,里面的变量会受到别的地方的影响,那么我们

现在要做的就是,构建一个只有自己本身才可访问的闭包,保存只供本身使用的变量

构建一个闭包很简单,代码如下:

方式一:

 

[javascript]   
 
  1. var list_obj = document.getElementsByTagName('li');    
  2. for (var i = 0; i <= list_obj.length; i++) {  
  3. <span style="white-space:pre">    </span>list_obj[i].onclick = (function(i){ // outer function  
  4. <span style="white-space:pre">            </span>return function(){ //inner function  
  5. <span style="white-space:pre">                </span>alert(i);  
  6. <span style="white-space:pre">            </span>};  
  7. <span style="white-space:pre">    </span>})(i);    
  8. }*   

 

 

方式二:

 

[javascript]   
 
  1. var list_obj = document.getElementsByTagName('li');    
  2. for (var i = 0; i <= list_obj.length; i++) {    
  3.      
  4.    (function(i){  
  5.         //var p = i      
  6.         list_obj[i].onclick = function() {        
  7.             alert(i);        
  8.         }  
  9.    })(i);  
  10. }   

转载于:https://www.cnblogs.com/tzz-ing/p/5504736.html

你可能感兴趣的文章
Quartz.Net学习笔记(二) Jobs And Triggers
查看>>
java 注解
查看>>
砸砖块
查看>>
如何用启动界面给用户创造出色的第一印象
查看>>
.NET-记一次架构优化实战与方案-目录
查看>>
附加事件
查看>>
DRBD+Heratbeat+NFS高可用文件共享存储
查看>>
20145203盖泽双 反汇编代码实践
查看>>
阿里妈妈-RAP项目的实践(1)
查看>>
电子书下载:Game Programming Gems 2
查看>>
近期项目计划
查看>>
ssh 配置免密失败
查看>>
Python的小技巧小知识
查看>>
jquery.form.js实现异步上传
查看>>
教室里的不速之客-赵广宇
查看>>
linux awk命令详解
查看>>
Isight Linux 2016hf2 安装步骤
查看>>
python selenium 鼠标悬停
查看>>
【HTML】placeholder中换行
查看>>
查看CPU数量和核心数
查看>>