浅谈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 相关文章推荐
设置下载不需要倒计时cookie(倒计时代码)
Nov 19 Javascript
自动刷新网页,自动刷新当前页面,JS调用
Jun 24 Javascript
Javascript中匿名函数的多种调用方式总结
Dec 06 Javascript
jQuery实现html元素拖拽
Jul 21 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
Sep 26 Javascript
关于session和cookie的简单理解
Jun 08 Javascript
JS中正则表达式全局匹配模式 /g用法详解
Apr 01 Javascript
angular bootstrap timepicker TypeError提示怎么办
Jun 13 Javascript
vue监听键盘事件的快捷方法【推荐】
Jul 11 Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 Javascript
微信小程序云开发详细教程
May 16 Javascript
微信小程序实现批量倒计时功能
Nov 01 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
Home Coffee Roasting
2021/03/03 咖啡文化
PHP4实际应用经验篇(5)
2006/10/09 PHP
mysql建立外键
2006/11/25 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
Python 多进程原理及实现
2020/12/21 Python
一般党员对照检查材料
2014/09/24 职场文书
银行授权委托书格式
2014/10/10 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
总结python多进程multiprocessing的相关知识
2021/06/29 Python
MySQL笔记 —SQL运算符
2022/01/18 MySQL