浅谈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插件开发中的extend方法
Nov 19 Javascript
node.js中的path.resolve方法使用说明
Dec 08 Javascript
jQuery实现冻结表格行和列
Apr 29 Javascript
详解JavaScript中的客户端消息框架设计原理
Jun 24 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 Javascript
JS+Canvas绘制动态时钟效果
Nov 10 Javascript
JavaScript继承定义与用法实践分析
May 28 Javascript
layer.confirm()右边按钮实现href的例子
Sep 27 Javascript
JSON获取属性值方法代码实例
Jun 30 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
Jul 20 Javascript
vue项目中使用rem,在入口文件添加内容操作
Nov 11 Javascript
微信小程序基础教程之echart的使用
Jun 01 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连接Access数据库的方法小结
2013/06/20 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
python 高阶函数简单介绍
2021/02/19 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
护理专业大学生自我推荐信
2014/01/25 职场文书
交通文明倡议书
2014/05/16 职场文书
社区春季防火方案
2014/06/02 职场文书
班主任寄语2015
2015/02/26 职场文书
远程教育学习心得体会
2016/01/23 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS
MySQL自定义函数及触发器
2022/08/05 MySQL