JavaScript中的闭包原理分析


Posted in Javascript onMarch 08, 2010

我们来看一个定义:
Closure
所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
这说明了,JavaScript中的闭包是包含了上下文的函数,也就是说,这个函数的作用基础,是它所处的环境,这是不能超越的,跟线性代数是不是有一点似曾相识的感觉呢?
换个角度看,闭包的作用是为了实现OO。JavaScript中,没有像C++那样的public、private、protect属性标识, 建立起类比较困难。“类是带行为的数据,而闭包是带数据的行为”,在JavaScript中我们用函数的定义代替类的定义,用闭包代替了setter/getter方法。请看一段livecode:

function f1(){ 

var n=1; 


function getter(){ 



alert(n); 


} 


return getter; 

}

上文中n的声明和函数getter组成了一个典型的闭包。最终返回的函数,即刚刚所讲的“行为”,其实目的就是为了得到n的值,所以说闭包就是带有数据的行为。
另外,我觉得阮一峰说的闭包也是很简洁的:“我的理解是,闭包就是能够读取其他函数内部变量的函数。”
另一篇更为学术的解释:
http://demo.3water.com/js/javascript_bibao/index.htm
我希望各位能够真正从学术上的定义理解闭包,因为所有对闭包定义的诠释和简化都是对JavaScript的片面解读。
Javascript 相关文章推荐
javascript jQuery插件练习
Dec 24 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
Jul 10 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
Dec 26 Javascript
自写的jQuery异步加载数据添加事件
May 15 Javascript
JS不能跨域借助jquery获取IP地址的方法
Aug 20 Javascript
JavaScript中的数值范围介绍
Dec 29 Javascript
jquery不常用方法汇总
Jul 26 Javascript
JavaScript实现文字跟随鼠标特效
Aug 06 Javascript
Vue实现导出excel表格功能
Mar 30 Javascript
Javascript三种字符串连接方式及性能比较
May 28 Javascript
微信小程序页面滚动到指定位置代码实例
Sep 07 Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 Javascript
ExtJS GridPanel 根据条件改变字体颜色
Mar 08 #Javascript
JavaScript 滚轮事件使用说明
Mar 07 #Javascript
javascript下4个跨浏览器必备的函数
Mar 07 #Javascript
Zero Clipboard js+swf实现的复制功能使用方法
Mar 07 #Javascript
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
Mar 07 #Javascript
javascript实现面向对象类的功能书写技巧
Mar 07 #Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 #Javascript
You might like
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
php导出生成word的方法
2015/12/25 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
基于Python os模块常用命令介绍
2017/11/03 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
骆驼官方商城:CAMEL
2016/11/22 全球购物
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
.net面试题
2015/12/22 面试题
护士专业推荐信
2013/11/02 职场文书
运动会广播稿400字
2014/01/25 职场文书
爱国主义演讲稿
2014/05/07 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
教师暑期培训感言
2014/08/15 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
新生入学欢迎词
2015/01/26 职场文书
五四青年节活动总结
2015/02/10 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL