浅析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 相关文章推荐
轻轻松松学习JavaScript
Feb 25 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
解析javascript 实用函数的使用详解
May 10 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
Aug 07 Javascript
js获取系统的根路径实现介绍
Sep 08 Javascript
node.js中的事件处理机制详解
Nov 26 Javascript
javascript基础知识讲解
Jan 11 Javascript
JS图片预加载插件详解
Jun 21 Javascript
Vue无限滑动周选择日期的组件的示例代码
Jul 18 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
Oct 29 Javascript
react-native 实现购物车滑动删除效果的示例代码
Jan 15 Javascript
vue中 this.$set的使用详解
Nov 17 Vue.js
父子窗体间传递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实现每天自动变换随机问候语的方法
2015/05/12 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
详解Python的Django框架中的通用视图
2015/05/04 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python Requests 基础入门
2016/04/07 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
python五子棋游戏的设计与实现
2019/06/18 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
文明教师事迹材料
2014/01/16 职场文书
大学军训感言200字
2014/02/26 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
商务助理求职信范文
2014/04/20 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
院系推荐意见
2015/06/05 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP