浅析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 相关文章推荐
写自已的js类库需要的核心代码
Jul 16 Javascript
javascript break指定标签打破多层循环示例
Jan 20 Javascript
巧用canvas
Jan 21 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
May 11 Javascript
用原生JS实现简单的多选框功能
Jun 12 Javascript
Angularjs单选框相关的示例代码
Aug 17 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
Sep 11 Javascript
使用Vuex实现一个笔记应用的方法
Mar 13 Javascript
JavaScript事件对象event用法分析
Jul 27 Javascript
layer iframe 设置关闭按钮的方法
Sep 12 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
Sep 21 Javascript
在Vue中使用Select选择器拼接label的操作
Oct 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
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
python matplotlib实现双Y轴的实例
2019/02/12 Python
Python ellipsis 的用法详解
2020/11/20 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
校本教研工作制度
2014/01/22 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
nginx配置限速限流基于内置模块
2022/05/02 Servers
Go 内联优化让程序员爱不释手
2022/06/21 Golang