浅谈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 相关文章推荐
小议Function.apply() 之一------(函数的劫持与对象的复制)
Nov 30 Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 Javascript
bootstrap实现动态进度条效果
Mar 08 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
Jun 22 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
Sep 21 Javascript
小程序和web画三角形实现解析
Sep 02 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
Nov 06 Javascript
vue中英文切换实例代码
Jan 21 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
Mar 07 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
Aug 13 Javascript
JS实现简易贪吃蛇游戏
Aug 24 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获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
如何在一个页面显示多个百度地图
2013/04/07 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
python批量下载图片的三种方法
2013/04/22 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
通过实例解析python and和or使用方法
2020/11/14 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
Java servlet面试题
2012/03/04 面试题
电气自动化大学生求职信
2013/10/16 职场文书
售后主管岗位职责
2013/12/08 职场文书
社区春季防火方案
2014/06/02 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
作文批改评语
2014/12/25 职场文书
电话营销开场白
2015/05/29 职场文书