浅谈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 相关文章推荐
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
Feb 15 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
Nov 11 Javascript
js获取事件源及触发该事件的对象
Oct 24 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
iframe调用父页面函数示例详解
Jul 17 Javascript
详解Javascript动态操作CSS
Dec 08 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
Aug 25 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
May 24 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
Jan 20 Javascript
js动态获取时间的方法分析
Aug 02 Javascript
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
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
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
javascript 必知必会之closure
2009/09/21 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
Python实现基本线性数据结构
2016/08/22 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
python能做什么 python的含义
2019/10/12 Python
Python网页解析器使用实例详解
2020/05/30 Python
Python控制台实现交互式环境执行
2020/06/09 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
销售行业个人求职自荐信
2013/09/25 职场文书
工程项目经理岗位职责
2013/12/15 职场文书
党员干部一句话承诺
2014/05/30 职场文书
2015年小学开学寄语
2015/02/27 职场文书
原告离婚代理词
2015/05/23 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis