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 相关文章推荐
Jquery 表格合并的问题分享
Sep 17 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
Sep 25 Javascript
Javascript学习笔记之相等符号与严格相等符号
Nov 23 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
Feb 18 Javascript
一步步教大家编写酷炫的导航栏js+css实现
Mar 14 Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
Jun 15 Javascript
javaScript封装的各种写法
Aug 14 Javascript
微信小程序实现动态获取元素宽高的方法分析
Dec 10 Javascript
JS运算符简单用法示例
Jan 19 Javascript
vue使用原生swiper代码实例
Feb 05 Javascript
Vue如何实现验证码输入交互
Dec 07 Vue.js
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使用者状态管理功能的应用
2006/10/09 PHP
php中将网址转换为超链接的函数
2011/09/02 PHP
php以post形式发送xml的方法
2014/11/04 PHP
php数组添加元素方法小结
2014/12/20 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
jQuery 渐变下拉菜单
2009/12/15 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
JSON Web Tokens的实现原理
2017/04/02 Python
python使用Tesseract库识别验证
2018/03/21 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
如何通过python计算圆周率PI
2020/11/11 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
药品业务员岗位职责
2014/04/17 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
宣传标语大全
2014/07/01 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
导游词之长城八达岭
2019/09/24 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL