浅谈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 相关文章推荐
在页面上点击任一链接时触发一个事件的代码
Apr 07 Javascript
JS是否可以跨文件同时控制多个iframe页面的应用技巧
Dec 16 Javascript
JavaScript中String和StringBuffer的速度之争
Apr 01 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
Dec 26 Javascript
js showModalDialog弹出窗口实例详解
Jan 07 Javascript
简介AngularJS中使用factory和service的方法
Jun 17 Javascript
Ajax中解析Json的两种方法对比分析
Jun 25 Javascript
jQuery使用unlock.js插件实现滑动解锁
Apr 04 jQuery
关于Vue在ie10下空白页的debug小结
May 02 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
微信小程序时间轴实现方法示例
Jan 14 Javascript
js实现图片局部放大效果详解
Mar 18 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
德生S2000电路分析
2021/03/02 无线电
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
PHP树-不需要递归的实现方法
2016/06/21 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
javascript模块化简单解析
2016/04/07 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
Python3基础之基本数据类型概述
2014/08/13 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
美国时尚在线:Showpo
2017/09/08 全球购物
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
linux面试题参考答案(10)
2016/10/26 面试题
大学生求职自我评价
2014/01/16 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
市场营销计划书
2019/04/24 职场文书
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技