浅谈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 仿QQ校友的DIV模拟窗口效果源码
Mar 24 Javascript
offsetHeight在OnLoad中获取为0的现象
Jul 22 Javascript
jQuery实现“扫码阅读”功能
Jan 21 Javascript
js实现横向伸展开的二级导航菜单代码
Aug 28 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
Jun 03 Javascript
Html中 IFrame的用法及注意点
Dec 22 Javascript
jQuery扩展+xml实现表单验证功能的方法
Dec 25 Javascript
react-native使用react-navigation进行页面跳转导航的示例
Sep 07 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
Apr 09 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 Javascript
Vue实现计算器计算效果
Aug 17 Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 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/12/06 PHP
smarty中post用法实例
2014/11/28 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
js回调函数仿360开机
2019/12/26 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python读取MRI并显示为灰度图像实例代码
2018/01/03 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
python Zmail模块简介与使用示例
2020/12/19 Python
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
外语系大学生自荐信范文
2014/03/01 职场文书
教师党员承诺书
2014/03/25 职场文书
生产车间标语
2014/06/11 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
团员自我评价范文
2015/03/10 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
nginx访问报403错误的几种情况详解
2022/07/23 Servers