浅谈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的设计模式
Nov 22 Javascript
Prototype使用指南之selector.js说明
Oct 26 Javascript
走出JavaScript初学困境—js初学
Dec 29 Javascript
jQuery 处理网页内容的实现代码
Feb 15 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
Jan 24 Javascript
JavaScript自定义事件介绍
Aug 29 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 Javascript
js实现的xml对象转json功能示例
Dec 24 Javascript
JS非行间样式获取函数的实例代码
Jun 05 Javascript
JS数组实现分类统计实例代码
Sep 30 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
Mar 03 Javascript
JS变量提升原理与用法实例浅析
May 22 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
php 生成短网址原理及代码
2014/01/23 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Python实现身份证号码解析
2015/09/01 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
Python笔试面试题小结
2019/09/07 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
django中ImageField的使用详解
2020/12/21 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
留学自荐信的技巧
2013/10/17 职场文书
教师实习自我鉴定
2013/12/11 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
运动会广播稿80字
2014/01/23 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
雨花台导游词
2015/02/06 职场文书