浅谈JavaScript for循环 闭包


Posted in Javascript onJune 22, 2016

有个网友问了个问题,如下的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[i].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 = 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、加一层闭包,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+')')  
  }   
}

以上就是小编为大家带来的浅谈JavaScript for循环 闭包全部内容了,希望大家多多支持三水点靠木~

Javascript 相关文章推荐
ext for eclipse插件安装方法
Apr 27 Javascript
javascript 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
Dec 04 Javascript
js setTimeout()函数介绍及应用以倒计时为例
Dec 12 Javascript
javascript根据像素点取位置示例
Jan 27 Javascript
父节点获取子节点的字符串示例代码
Feb 26 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
Aug 06 Javascript
javascript实现图片上传前台页面
Aug 18 Javascript
js窗口关闭提示信息(兼容IE和firefox)
Oct 23 Javascript
jquery读写cookie操作实例分析
Dec 24 Javascript
使用FormData实现上传多个文件
Dec 04 Javascript
Javascript获取随机数的实现方法
Jun 22 #Javascript
解析浏览器端的AJAX缓存机制
Jun 21 #Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
Jun 21 #Javascript
第十篇BootStrap轮播插件使用详解
Jun 21 #Javascript
JavaScript简单获取页面图片原始尺寸的方法
Jun 21 #Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 #Javascript
js简单判断flash是否加载完成的方法
Jun 21 #Javascript
You might like
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
php实现单链表的实例代码
2013/03/22 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python实现类之间的方法互相调用
2018/04/29 Python
详解用python写一个抽奖程序
2019/05/10 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
pycharm实现猜数游戏
2020/12/07 Python
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
爸爸的花儿落了教学反思
2014/02/20 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
创先争优活动心得体会
2014/09/04 职场文书
三问三解心得体会
2014/09/05 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书