浅析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 放大镜 v1.0 基于Yui2 实现的放大镜效果
Mar 08 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
Mar 26 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
Oct 21 Javascript
jQuery 删除/替换DOM元素的几种方式
May 20 Javascript
vue实现留言板todolist功能
Aug 16 Javascript
玩转Koa之koa-router原理解析
Dec 29 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
Oct 24 Javascript
VuePress 中如何增加用户登录功能
Nov 29 Javascript
JavaScript设计模式之策略模式实现原理详解
May 29 Javascript
基于JS实现快速读取TXT文件
Aug 25 Javascript
详解Vue中Axios封装API接口的思路及方法
Oct 10 Javascript
Angular处理未可知异常错误的方法详解
Jan 17 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
学习php分页代码实例
2013/10/24 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
2019/02/21 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
python求pi的方法
2014/10/08 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
python微信公众号开发简单流程
2018/03/23 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
Python Gitlab Api 使用方法
2019/08/28 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
美国最受欢迎的童装品牌之一:The Children’s Place
2016/07/23 全球购物
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
2015年基建工作总结范文
2015/05/23 职场文书