Javascript闭包

 

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

1function init1() {
2  var pAry = document.getElementsByTagName("p"); 
3  for( var i=0; i<pAry.length; i++ ) {
4     pAry[i].i = i;
5     pAry[i].onclick = function() {
6        alert(this.i); 
7     }
8  }
9}

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

1function init2() {
2  var pAry = document.getElementsByTagName("p"); 
3  for( var i=0; i<pAry.length; i++ ) {
4   (pAry[i].onclick = function() {
5        alert(arguments.callee.i);
6    }).i = i;
7  }
8}

后又想到了三种

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

01function init3() {
02  var pAry = document.getElementsByTagName("p");
03  for( var i=0; i<pAry.length; i++ ) {
04   (function(arg){
05       pAry[i].onclick = function() {
06          alert(arg);
07       };
08   })(i);//调用时参数 
09  }
10}

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

01function init4() {
02  var pAry = document.getElementsByTagName("p");
03  for( var i=0; i<pAry.length; i++ ) { 
04    (function () {
05      var temp = i;//调用时局部变量 
06      pAry[i].onclick = function() {
07        alert(temp);
08      }
09    })();
10  }
11}

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

01function init5() {
02  var pAry = document.getElementsByTagName("p");
03  for( var i=0; i<pAry.length; i++ ) {
04   pAry[i].onclick = function(arg) {
05       return function() {//返回一个函数 
06       alert(arg);
07     }
08   }(i);
09  }
10}

后又发现了两种

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

1function init6() {
2    var pAry = document.getElementsByTagName("p");
3    for( var i=0; i<pAry.length; i++ ) {
4      pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例
5    }
6}

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

1function init7() {
2    var pAry = document.getElementsByTagName("p");
3    for( var i=0; i<pAry.length; i++ ) {
4         pAry[i].onclick = Function('alert('+i+')');
5    }
6
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值