浅谈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 相关文章推荐
十个优秀的Ajax/Javascript实例网站收集
Mar 31 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
Jul 18 Javascript
关于jQuery判断元素是否存在的问题示例探讨
Jul 21 Javascript
JavaScript 正则表达式中global模式的特性
Feb 25 Javascript
JavaScript学习笔记之数组求和方法
Mar 23 Javascript
JavaScript中setter和getter方法介绍
Jul 11 Javascript
vue2.0父子组件及非父子组件之间的通信方法
Jan 21 Javascript
vue实现ToDoList简单实例
Feb 07 Javascript
如何在vue中使用ts的示例代码
Feb 28 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
Nov 15 Javascript
layui switch 开关监听 弹出确定状态转换的例子
Sep 21 Javascript
jQuery实现轮播图效果
Nov 26 jQuery
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更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
php面向对象重点知识分享
2019/09/27 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
checkbox 多选框 联动实现代码
2008/10/22 Javascript
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
浅谈vue 多个变量同时赋相同值互相影响
2020/08/05 Javascript
python复制与引用用法分析
2015/04/08 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
轻松制作精彩视频:Animoto
2018/09/19 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
司机岗位职责
2013/11/15 职场文书
艺术节主持词
2014/04/02 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
Python使用openpyxl批量处理数据
2021/06/23 Python