浅谈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 相关文章推荐
jscript之Read an Excel Spreadsheet
Jun 13 Javascript
javascript 动态添加事件代码
Nov 30 Javascript
动态添加删除表格行的js实现代码
Feb 28 Javascript
jquery选择器简述
Aug 31 Javascript
jQuery使用$.ajax提交表单完整实例
Dec 11 Javascript
jQuery上传插件webupload使用方法
Aug 01 jQuery
JavaScript编程设计模式之构造器模式实例分析
Oct 25 Javascript
js登录滑动验证的实现(不滑动无法登陆)
Jan 03 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
Apr 26 Javascript
react-native android状态栏的实现
Jun 15 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
Jul 31 Javascript
vue中的计算属性和侦听属性
Nov 06 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
第九节--绑定
2006/11/16 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
Python偏函数实现原理及应用
2020/11/20 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
优秀幼教自荐信
2014/02/03 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
大学新生军训方案
2014/05/03 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
企业法人任命书
2015/09/21 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
浅谈Python类的单继承相关知识
2021/05/12 Python
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL