浅谈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 相关文章推荐
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
Feb 18 Javascript
Javascript load Page,load css,load js实现代码
Mar 31 Javascript
jquery.validate使用攻略 第五步 正则验证
Jul 01 Javascript
jquery win 7透明弹出层效果的简单代码
Aug 06 Javascript
Javascript 实现的数独解题算法网页实例
Oct 15 Javascript
js实现单行文本向上滚动效果实例代码
Nov 28 Javascript
js四舍五入数学函数round使用实例
May 09 Javascript
JavaScript不刷新实现浏览器的前进后退功能
Nov 05 Javascript
jquery 设置style:display的方法
Jan 29 Javascript
js简单实现竖向tab选项卡的方法
May 04 Javascript
极易被忽视的javascript面试题七问七答
Feb 15 Javascript
jQuery图片轮播插件——前端开发必看
May 31 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的计数器程序
2006/10/09 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
phpwind放自动注册方法
2006/12/02 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
Python函数式编程指南(二):从函数开始
2015/06/24 Python
python中的格式化输出用法总结
2016/07/28 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
python实现验证码识别功能
2018/06/07 Python
python如何删除文件中重复的字段
2019/07/16 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
分公司任命书
2014/06/06 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
云台山导游词
2015/02/03 职场文书
创业计划书之寿司
2019/07/19 职场文书
导游词之江南周庄
2019/12/06 职场文书