浅谈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框架的AJAX实例代码
Nov 03 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
Aug 05 Javascript
js 第二代身份证号码的验证机制代码
May 12 Javascript
jquery ajax例子返回值详解
Sep 11 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
Dec 23 Javascript
JS实现div居中示例
Apr 17 Javascript
js时间日期格式化封装函数
Dec 02 Javascript
JavaScript常见的五种数组去重的方式
Dec 15 Javascript
JS异步文件分片断点上传的实现思路
Dec 25 Javascript
如何为vuex实现带参数的 getter和state.commit
Jan 04 Javascript
vue 解决异步数据更新问题
Oct 29 Javascript
详谈vue中router-link和传统a链接的区别
Jul 22 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函数extension_loaded()用法实例
2015/01/19 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
简单实现python爬虫功能
2015/12/31 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
python实现统计代码行数的小工具
2019/09/19 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
在C#中如何实现多态
2014/07/02 面试题
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
老师对学生的评语
2014/04/18 职场文书
体育教师求职信
2014/05/24 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
小学教师工作总结2015
2015/04/07 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android