Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 798|回复: 0

javascript 闭包-- 一个例子

[复制链接]

该用户从未签到

发表于 2011-10-12 11:12:40 | 显示全部楼层 |阅读模式
有个网友问了个问题,如下的HTML,为什么每次输出都是5,而不是点击每个p,

就alert出对应的1,2,3,4,5。

<html >   
<head>   
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   
<title>闭包演示</title>   
<script type="text/javascript">   
function init() {   
    var pAry = document.getElementsByTagName("p");   
    for( var i=0; i<pAry.length; i++ ) {   
         pAry.onclick = function() {   
         alert(i);   
    }   
  }   
}   
</script>   
</head>   
<body onload="init();">   
<p>产品一</p>   
<p>产品二</p>   
<p>产品三</p>   
<p>产品四</p>   
<p>产品五</p>   
</body>   
</html>  



解决方式有两种,
1、将变量 i 保存给在每个段落对象(p)上

function init() {   
  var pAry = document.getElementsByTagName("p");   
  for( var i=0; i<pAry.length; i++ ) {   
     pAry.i = i;   
     pAry.onclick = function() {   
        alert(this.i);   
     }   
  }   
}   

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

function init2() {   
  var pAry = document.getElementsByTagName("p");   
  for( var i=0; i<pAry.length; i++ ) {      
   (pAry.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.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.onclick = function() {      
        alert(temp);      
      }   
    })();   
  }   
}   
5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

function init5() {   
  var pAry = document.getElementsByTagName("p");   
  for( var i=0; i<pAry.length; i++ ) {      
   pAry.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.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.onclick = Function('alert('+i+')')   
    }   
}   
引自与:http://snandy.javaeye.com/blog/250073
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-4 15:29 , Processed in 0.380978 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表