浅析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 相关文章推荐
使用prototype.js 的时候应该特别注意的几个问题.
Apr 12 Javascript
javascript是怎么继承的介绍
Jan 05 Javascript
Jquery Post处理后不进入回调的原因及解决方法
Jul 15 Javascript
js密码强度检测
Jan 07 Javascript
详解jQuery uploadify文件上传插件的使用方法
Dec 16 Javascript
jquery表单验证实例仿Toast提示效果
Mar 03 Javascript
使用JavaScript根据图片获取条形码的方法
Jul 04 Javascript
利用node.js如何创建子进程详解
Dec 09 Javascript
详解javascript replace高级用法
Feb 17 Javascript
微信小程序定义和调用全局变量globalData的实现
Nov 01 Javascript
微信小程序 自定义弹窗实现过程(附代码)
Dec 05 Javascript
Vue this.$router.push(参数)实现页面跳转操作
Sep 09 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&amp;&amp;mysql)三
2006/10/09 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
怎么在Windows系统中搭建php环境
2013/08/31 PHP
解决php接收shell返回的结果中文乱码问题
2014/01/23 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
jquery 事件对象属性小结
2010/04/27 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
js实现分页功能
2017/05/24 Javascript
vue组件生命周期详解
2017/11/07 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
JavaScript中ES6规范中let和const的用法和区别
2020/08/06 Javascript
Python列表计数及插入实例
2014/12/17 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
python使用wxpython开发简单记事本的方法
2015/05/20 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
暑期社会实践证明书
2014/11/17 职场文书
综合素质评价自我评价
2015/03/06 职场文书
寒假生活随笔
2015/08/15 职场文书
文艺委员竞选稿
2015/11/19 职场文书
pytorch查看网络参数显存占用量等操作
2021/05/12 Python
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL