浅析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 相关文章推荐
同一个表单 根据要求递交到不同页面的实现方法小结
Aug 05 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
Feb 07 Javascript
jQuery图片滚动图片的效果(另类实现)
Jun 02 Javascript
jQuery常用知识点总结以及平时封装常用函数
Feb 23 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
概述如何实现一个简单的浏览器端js模块加载器
Dec 07 Javascript
基于BootStrap实现简洁注册界面
Jul 20 Javascript
聊聊Vue.js的template编译的问题
Oct 09 Javascript
Angular CLI在Angular项目中如何使用scss详解
Apr 10 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
Jun 28 Javascript
Node.js创建一个Express服务的方法详解
Jan 06 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写的MySQL数据库用户认证系统代码
2007/03/22 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
javascript 特殊字符串
2009/02/25 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
基于vue实现分页效果
2017/11/06 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
js实现购物车功能
2018/06/12 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
js实现查询商品案例
2020/07/22 Javascript
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
python flask框架实现重定向功能示例
2019/07/02 Python
python模块内置属性概念及实例
2021/02/18 Python
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
印尼极简主义和实惠的在线家具店:Fabelio
2019/03/27 全球购物
行政助理岗位职责
2013/11/10 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
工作失职自我检讨书
2015/05/05 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书