浅析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.boxy对话框插件代码
Oct 26 Javascript
jQuery 幻灯片插件(带缩略图功能)
Jan 24 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
Jul 21 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
Dec 14 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
Jun 13 Javascript
浅谈关于axios和session的一些事
Jul 13 Javascript
讲解vue-router之命名路由和命名视图
May 28 Javascript
bootstrap与pagehelper实现分页效果
Dec 29 Javascript
Node配合WebSocket做多文件下载以及进度回传
Nov 07 Javascript
微信小程序静默登录的实现代码
Jan 08 Javascript
微信小程序点击滚动到指定位置的实现
May 22 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的header和asp中的redirect比较
2006/10/09 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
php遍历CSV类实例
2015/04/14 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中的函数作用域
2018/05/07 Python
python最小生成树kruskal与prim算法详解
2019/01/17 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
主持人演讲稿范文
2013/12/28 职场文书
三年级音乐教学反思
2014/01/28 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
公务员年终个人总结
2015/02/12 职场文书
老兵退伍感言
2015/08/03 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
TV动画《间谍过家家》公开PV
2022/03/20 日漫