浅谈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 相关文章推荐
检测input每次的输入是否合法遇到汉字输入就有问题
May 23 Javascript
IE6下opacity与JQuery的奇妙结合
Mar 01 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
Dec 04 Javascript
Angular2 组件交互实例详解
Aug 24 Javascript
基于Vue2.X的路由和钩子函数详解
Feb 09 Javascript
react项目实践之webpack-dev-serve
Sep 14 Javascript
加快Vue项目的开发速度的方法
Dec 12 Javascript
js+html5 canvas实现ps钢笔抠图
Apr 28 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
Apr 26 Javascript
PHP读取远程txt文档到数组并实现遍历
Aug 25 Javascript
JavaScript严格模式不支持八进制的问题讲解
Nov 07 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
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
python对字典进行排序实例
2014/09/25 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
python+opencv实现动态物体识别
2018/01/09 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
Django Rest framework权限的详细用法
2019/07/25 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
高二生物教学反思
2014/01/27 职场文书
法制宣传实施方案
2014/03/13 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
朋友离别感言
2015/08/04 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
Python 数据科学 Matplotlib图库详解
2021/07/07 Python