浅析javascript闭包 实例分析


Posted in Javascript onDecember 25, 2010

官方解释
“闭包”是一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数),因而这些变量也是环境表达式的一部分。
通俗解释
Javascript中所有的函数都是一个闭包。不过一般来说,嵌套的function产生的闭包更为强大,也是大部分时候我们所说的“闭包”。看如下代码:

<script type="text/javascript"> 
<!-- 
//外层函数a 
function a(){ 
//临时变量i 
var i = 0; 
//内层函数b 
function b(){ 
//引用外层临时变量i 
alert(++i); 
} 
//执行结果,返回内层函数b 
return b; 
} 
//执行外层函数a,同时给c一个指向内层函数b的引用 
//若按正常理解,此语句执行完后i将被GC回收,此时的i应为“undefine” 
var c = a(); 
//执行内层函数,由于闭包的缘故,函数b中i仍然引用的是外部的临时变量i 
c(); 
--> 
</script>

这段脚本在执行完var c=a()之后,变量c实际上就指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示i的值。这段代码其实就是一个闭包,为什么?因为函数a外的变量c引用了函数a内部的函数b。
Javascript的垃圾回收机制
由于javascript特殊的垃圾回收机制,才导致了闭包的产生。Javascript垃圾回收机制的大体规则如下:
在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象相互引用,而不再被第3者引用,那么这两个互相引用的对象也会被回收。而在上述的脚本中,函数a被b引用,函数b又被函数a外的c所引用,这就是为什么函数a执行后不被回收的原因。
闭包的应用场景
1. 保护函数内的变量安全。以上面的例子为例,函数a中变量i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
2. 在内存中维持一个变量。依然如上面的例子,由于闭包,函数a中的i一直存在于内存中,因此每次执行c(),i都会加1。
3. 通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)。如下,私有属性和私有方法在Constructor外是无法访问的:
function Constructor(…){ 
var that = this; 
var membername = value; 
function membername(…){…} 
}
Javascript 相关文章推荐
jQuery Jcrop插件实现图片选取功能
Nov 23 Javascript
js有关元素内容操作小结
Dec 20 Javascript
jQuery 选择器项目实例分析及实现代码
Dec 28 Javascript
js如何判断用户是在PC端和还是移动端访问
Apr 24 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
Mar 04 Javascript
浏览器中url存储的JavaScript实现
Jul 07 Javascript
JavaScript判断DIV内容是否为空的方法
Jan 29 Javascript
JavaScript取得gridview中获取checkbox选中的值
Jul 24 Javascript
JS实现留言板功能[楼层效果展示]
Dec 27 Javascript
详解html-webpack-plugin插件(用法总结)
Sep 12 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
Sep 30 Javascript
利用es6 new.target来对模拟抽象类的方法
May 10 Javascript
父子窗体间传递JSON格式的数据的代码
Dec 25 #Javascript
javascript自执行函数之伪命名空间封装法
Dec 25 #Javascript
Ext对基本类型的扩展 ext,extjs,format
Dec 25 #Javascript
JQuery live函数
Dec 24 #Javascript
jquery 单击li防止重复加载的实现代码
Dec 24 #Javascript
基于jquery的关于动态创建DOM元素的问题
Dec 24 #Javascript
在JavaScript中获取请求的URL参数
Dec 22 #Javascript
You might like
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
php动态生成JavaScript代码
2009/03/09 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
PHP echo()函数讲解
2019/02/15 PHP
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
详解js中==与===的区别
2017/01/08 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
Python函数定义及传参方式详解(4种)
2019/03/18 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
StubHub德国:购买和出售门票
2017/09/06 全球购物
支部组织生活会方案
2014/06/10 职场文书
国庆促销活动总结
2014/08/29 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python