简短几句 通俗解释javascript的闭包


Posted in Javascript onJanuary 17, 2011

何谓没有被释放资源的栈区和预执行的过程,用一个最常见的示例来解释:
比方现在我们有一个ul,下面有很多个li,需要遍历他们为他们绑定单击事件,并在点击后将当前下标传递给另外一个function来进行额外的处理:

for(var i=0; i<agroup.length; i++) { 
agroup[i].onclick = function() { 


handler(i); 

} 
}

执行结果显而易见对吧?在handler中,获取传递过去的参数i,你看到的将全部是最大的下标,这个时候,我们通常用下面的办法解决:
for(var i=0; i<agroup.length; i++) { 
agroup[i].i = i 

agroup[i].onclick = function() { 


handler(this.i); 

} 
}

那么在这里,先讲一下this的指向问题,从通常来说,javascript中的this是指向当前引用他的对象的。上面我们相当为this新增了一个为i的属性,他的值就是当前的下标值。
那么用闭包的方式如何解决这个问题?其实原理相同,我们需要预先的把i值保存起来,或叫作传递:
for(var i=0; i<agroup.length; i++) { 
agroup[i].onclick = function(index) { 


return function() { 



handler(index); 


} 

}(i); 
}

这个时候你会得到正确的下标,这样做与增加i属性有何雷同之处?也就是他们都预先把下标i值传递或是储存起来。在上面的演示中,预执行onclick所引用的函数,而这个
函数当中返回了一个内嵌函数,形成一个没有被释放资源的栈区,并在预执行的时候将i值以参数的形式传入这个作用域(解释能力有问题,这句解释不知道是否准确,欢迎砖拍)。
综上所述,闭包的作用通常是改变作用域或预执行。应该看官很明白了,上面个出的示例很局限,闭包的应用范围是很广的,了解其因果,才能灵活的使用它。
auntion 2011-11-15
mail Auntion@gmail.com
QQ 82874972
原创文章,请尊重打字的辛劳和作者的权益,转载时请不要删除这里的作者信息。
Javascript 相关文章推荐
php is_numberic函数造成的SQL注入漏洞
Mar 10 Javascript
JavaScript中使用Object.create()创建对象介绍
Dec 30 Javascript
laypage分页控件使用实例详解
May 19 Javascript
Angular.JS中指令ng-if的注意事项小结
Jun 21 Javascript
JavaScript实现修改伪类样式
Nov 27 Javascript
vue 不使用select实现下拉框功能(推荐)
May 17 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
C#程序员入门学习微信小程序的笔记
Mar 05 Javascript
微信小程序 如何获取网络状态
Jul 26 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
Mar 04 Javascript
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
javascript 内存回收机制理解
Jan 17 #Javascript
javascript 延迟加载技术(lazyload)简单实现
Jan 17 #Javascript
关于COOKIE个数与大小的问题
Jan 17 #Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
Jan 17 #Javascript
Jquery 插件开发笔记整理
Jan 17 #Javascript
JQuery学习笔记 nt-child的使用
Jan 17 #Javascript
Jquery知识点三 jquery表单对象操作
Jan 17 #Javascript
You might like
PHP脚本数据库功能详解(中)
2006/10/09 PHP
php 文章采集正则代码
2009/12/28 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
php数组使用规则分析
2015/02/27 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
python ip正则式
2009/05/07 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
python使用turtle库绘制时钟
2020/03/25 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
django删除表重建的实现方法
2019/08/28 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
RealTek面试题
2016/06/28 面试题
幼教毕业生自我鉴定
2014/01/12 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
民政工作个人总结
2015/02/28 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
高一作文之乐趣
2019/11/21 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
解析Java异步之call future
2021/06/14 Java/Android
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
实战Python爬虫爬取酷我音乐
2022/04/11 Python