浅谈js中的闭包


Posted in Javascript onMarch 16, 2015

首先我们先来看一段代码:

<a href="javascript:void(0);">111</a>

<a href="javascript:void(0);">222</a>

<a href="javacsript:void(0);">333</a>

var a=document.getElementsByTagName("a");
function b(){


for(var i=0;i<a.length;i++){


a[i].onclick=function(){



alert(i);


}


}

}

按照我们设计的初衷,应该是点击一个a标签就相应的弹出该标签的序列号,即点击第一个a就弹出0,点击第二个就弹出1...但是事实是弹出的始终是a标签的个数,这是什么原因呢?这个问题困扰了我很久,查阅了许多网上的资料还有参考书籍,大多说的似是而非,相信也有许多同学对其中原因也不甚了解,就这个问题我谈谈自己的理解,如有不当之处,还请批评指正。

就我个人的理解,上述函数未能达到目的的原因是,事件处理函数绑定了变量i,而该事件处理函数又赋值给了onclick,即是说只有在点击a标签的时候才会调用该函数,因此从逻辑上来说,在单纯的for循环里面function(){alert(i);}这段函数实际上是没有执行的,而当我们点击a标签的时候for循环早就已经执行完毕,此时i的值就是for循环执行完毕的终态值。通俗一点理解,就是这个i的值是属于b函数的,而我们需要的i的值是实时传递进事件处理函数中的值。那么有什么方法可以实现我们的设计初衷呢?聪明的同学可能已经猜到了,那就是使用闭包。

下面我们再来看一段代码:

var a=document.getElementsByTagName("a");
function b(){


for(var i=0;i<a.length;i++){



a[i].onclick=function(j){




return function(){




alert(j);



}


}(i);

}

}

b();

执行以上代码可以发现,我们所要的功能已经实现,即点击任意a标签都会弹出该标签所在的序列号。对上述代码,相信许多同学都看过许多雷同的版本,但是为什么这样做就能实现我们需要的功能了呢,一下是个人的一点浅见,如有不当,还请不吝赐教。

对上述代码的理解,其本质就是对变量i的理解。在这段代码中,函数执行到for循环处发现了一个立即调用函数,这个时候给这个立即调用函数传递实时的i变量值,函数立即调用完成,事件处理函数也就存储了实时的i变量值。

以上所述就是本文的全部内容了,希望对大家理解js闭包能够有所帮助。

Javascript 相关文章推荐
JavaScript下申明对象的几种方法小结
Oct 02 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
Mar 01 Javascript
node.js集成百度UE编辑器
Feb 05 Javascript
浅谈JavaScript中运算符的优先级
Jul 07 Javascript
jQuery实用技巧必备(中)
Nov 03 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
JavaScript代码性能优化总结(推荐)
May 16 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
JS原型链 详解及示例代码
Sep 06 Javascript
浅谈Vue组件及组件的注册方法
Aug 24 Javascript
node.js如何根据URL返回指定的图片详解
Oct 21 Javascript
JS数组索引检测中的数据类型问题详解
Jan 11 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
Mar 16 #Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 #Javascript
JavaScript中的DSL元编程介绍
Mar 15 #Javascript
JavaScript中的立即执行函数表达式介绍
Mar 15 #Javascript
Javascript中的arguments与重载介绍
Mar 15 #Javascript
JavaScript中的闭包介绍
Mar 15 #Javascript
Javascript中的匿名函数与封装介绍
Mar 15 #Javascript
You might like
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
Javascript实现的分页函数
2007/02/07 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
js中的caller和callee属性介绍和例子
2014/06/07 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
Python3 集合set入门基础
2020/02/10 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
python3中布局背景颜色代码分析
2020/12/01 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
班主任工作实习计划
2015/01/16 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis