浅析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与CSS复习(三)
Jun 29 Javascript
js对象之JS入门之Array对象操作小结
Jan 09 Javascript
javascript scrollTop正解使用方法
Nov 14 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
May 18 Javascript
基于Jquery实现表单验证
Jul 20 Javascript
微信小程序 自己制作小组件实例详解
Dec 22 Javascript
详解vue.js 开发环境搭建最简单攻略
Jun 12 Javascript
javascript获取指定区间范围随机数的方法
Sep 08 Javascript
vue axios 在页面切换时中断请求方法 ajax
Mar 05 Javascript
webpack v4 从dev到prd的方法
Apr 02 Javascript
vue 中动态绑定class 和 style的方法代码详解
Jun 01 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
Apr 23 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
go语言计算两个时间的时间差方法
2015/03/13 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
python 使用get_argument获取url query参数
2017/04/28 Python
python使用folium库绘制地图点击框
2018/09/21 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
python如何实现代码检查
2019/06/28 Python
Python气泡提示与标签的实现
2020/04/01 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
档案接收函
2014/01/13 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
大学英语专业求职信
2014/06/21 职场文书
化学教育专业自荐信
2014/07/04 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
体育教师教学随笔
2015/08/15 职场文书
《包身工》教学反思
2016/02/23 职场文书
六年级语文教学反思
2016/03/03 职场文书
入党申请书怎么写?
2019/06/21 职场文书
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python