浅析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引导程序
Oct 26 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 Javascript
多个jQuery版本共存的处理方案
Mar 17 Javascript
jscript读写二进制文件的方法
Apr 22 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
Jun 17 Javascript
JS实现的表格行上下移动操作示例
Aug 03 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
Jul 31 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
Dec 16 jQuery
详解vue-cli中模拟数据的两种方法
Jul 03 Javascript
深入webpack打包原理及loader和plugin的实现
May 06 Javascript
vue实现登录拦截
Jun 29 Javascript
Vue实现tab导航栏并支持左右滑动功能
Jun 28 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学习之PHP运算符
2006/10/09 PHP
PHP 采集获取指定网址的内容
2010/01/05 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
php socket通信简单实现
2016/11/18 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
python判断windows隐藏文件的方法
2014/03/21 Python
10款最好的Web开发的 Python 框架
2015/03/18 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python 调用Java实例详解
2017/06/02 Python
python logging日志模块的详解
2017/10/29 Python
Python for循环生成列表的实例
2018/06/15 Python
python中tab键是什么意思
2020/06/18 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
函授大专自我鉴定
2013/11/01 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
如何利用python创作字符画
2022/06/25 Python