浅谈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 相关文章推荐
js不是基础的基础
Dec 24 Javascript
客户端脚本中常常出现的一些问题和调试技巧
Jan 09 Javascript
基于jquery的页面划词搜索JS
Sep 14 Javascript
Bootstrap每天必学之导航
Nov 26 Javascript
详解javascript传统方法实现异步校验
Jan 22 Javascript
一道常被人轻视的web前端常见面试题(JS)
Feb 15 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
Vue.js实现实例搜索应用功能详细代码
Aug 24 Javascript
基于node.js express mvc轻量级框架实践
Sep 14 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
Sep 25 Javascript
微信小程序仿今日头条导航栏滚动解析
Aug 20 Javascript
JS实现简易日历效果
Jan 25 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数组删除元素示例
2014/03/21 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
PHP.vs.JAVA
2016/04/29 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
Python 多进程和数据传递的理解
2017/10/09 Python
python3实现随机数
2018/06/25 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Python判断有效的数独算法示例
2019/02/23 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
高一数学教学反思
2014/02/07 职场文书
离婚协议书标准格式
2014/10/04 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
2014年行政工作总结
2014/11/19 职场文书
2014年就业工作总结
2014/11/26 职场文书
迟到检讨书
2015/01/26 职场文书
城南旧事电影观后感
2015/06/16 职场文书
员工升职自我评价
2019/03/26 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL