浅谈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 相关文章推荐
javascript数据结构与算法之检索算法
Apr 04 Javascript
jquery中用jsonp实现搜索框功能
Oct 18 Javascript
浅述节点的创建及常见功能的实现
Dec 15 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
Mar 01 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
关于微信小程序bug记录与解决方法
Aug 15 Javascript
微信小程序页面缩放式侧滑效果的实现代码
Nov 15 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 Javascript
vue.js中导出Excel表格的案例分析
Jun 11 Javascript
深入了解Hybrid App技术的相关知识
Jul 17 Javascript
Vue实现附件上传功能
May 28 Javascript
使用vant的地域控件追加全部选项
Nov 03 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 采集书并合成txt格式的实现代码
2009/03/01 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
js中的string.format函数代码
2020/08/11 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Django中login_required装饰器的深入介绍
2017/11/24 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
买房子个人收入证明
2014/01/16 职场文书
大学军训感言200字
2014/02/26 职场文书
学校课外活动总结
2014/05/08 职场文书
飞越疯人院观后感
2015/06/09 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers