闭包

本文探讨了JavaScript中处理多个元素点击事件时遇到的闭包问题,并提供了七种不同的解决方案,包括利用闭包特性来正确捕获循环变量。

function init() {    

    var pAry = document.getElementsByTagName("p");    

    for( var i=0; i<pAry.length; i++ ) {    

         pAry[i].onclick = function() {    

         alert(i);    

    }    

  }    

}    

解决方式有两种,

1、将变量 i 保存给在每个段落对象(p)上

function init() {    

  var pAry = document.getElementsByTagName("p");    

  for( var i=0; i<pAry.length; i++ ) {    

     pAry[i].i = i;    

     pAry[i].onclick = function() {    

        alert(this.i);    

     }    

  }    

}    

2、将变量 i 保存在匿名函数自身

function init2() {    

  var pAry = document.getElementsByTagName("p");    

  for( var i=0; i<pAry.length; i++ ) {      

   (pAry[i].onclick = function() {    

        alert(arguments.callee.i);    

    }).i = i;    

  }    

}    

再增加3种

 3、加一层闭包,i以函数参数形式传递给内层函数

function init3() {    

  var pAry = document.getElementsByTagName("p");    

  for( var i=0; i<pAry.length; i++ ) {    

   (function(arg){        

       pAry[i].onclick = function() {        

          alert(arg);    

       };    

   })(i);//调用时参数    

  }    

}    

4、加一层闭包,i以局部变量形式传递给内存函数

function init4() {    

  var pAry = document.getElementsByTagName("p");    

  for( var i=0; i<pAry.length; i++ ) {      

    (function () {    

      var temp = i;//调用时局部变量    

      pAry[i].onclick = function() {      

        alert(temp);      

      }    

    })();    

  }    

}    

5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

function init5() {    

  var pAry = document.getElementsByTagName("p");    

  for( var i=0; i<pAry.length; i++ ) {      

   pAry[i].onclick = function(arg) {    

       return function() {//返回一个函数    

       alert(arg);    

     }    

   }(i);    

  }    

}   

又有一种方法

6、用Function实现,实际上每产生一个函数实例就会产生一个闭包

function init6() {    

    var pAry = document.getElementsByTagName("p");    

    for( var i=0; i<pAry.length; i++ ) {      

      pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例   

    }    

}   

 

再增加一种

7、用Function实现,注意与6的区别

function init7() {    

    var pAry = document.getElementsByTagName("p");    

    for( var i=0; i<pAry.length; i++ ) {    

         pAry[i].onclick = Function('alert('+i+')')   

    }    

}    

 

转载于:https://www.cnblogs.com/jayruan/p/5962665.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值