浅谈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 相关文章推荐
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
Jan 02 Javascript
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
JavaScript异步加载浅析
Dec 28 Javascript
JavaScript 匿名函数和闭包介绍
Apr 13 Javascript
JS常用字符串方法(推荐)
Jan 15 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
Jul 12 Javascript
详解AngularJS之$window窗口对象
Jan 17 Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 Javascript
详解滑动穿透(锁body)终极探索
Apr 16 Javascript
Vue通过provide inject实现组件通信
Sep 03 Javascript
js实现搜索提示框效果
Sep 05 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
Oct 30 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
全国FM电台频率大全 - 2 天津市
2020/03/11 无线电
PHP array 的加法操作代码
2010/07/24 PHP
php 缩略图实现函数代码
2011/06/23 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
jquery map方法使用示例
2014/04/23 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
2018/10/29 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
python调用java的jar包方法
2018/12/15 Python
对python函数签名的方法详解
2019/01/22 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
家居饰品店创业计划书
2014/01/31 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
感恩父母的演讲稿
2014/05/06 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
小学班长竞选稿
2015/11/20 职场文书