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 相关文章推荐
Opacity.js
Jan 22 Javascript
用javascript实现给出的盒子的序列是否可连为一矩型
Aug 30 Javascript
asp.net和asp下ACCESS的参数化查询
Jun 11 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
Feb 03 Javascript
JavaScript驾驭网页-CSS与DOM
Mar 24 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
Aug 17 Javascript
jQuery过滤选择器经典应用
Aug 18 Javascript
如何使用Vuex+Vue.js构建单页应用
Oct 27 Javascript
详解Angular Reactive Form 表单验证
Jul 06 Javascript
vue实例中data使用return包裹的方法
Aug 27 Javascript
一篇文章,教你学会Vue CLI 插件开发
Apr 17 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 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
同时提取多条新闻中的文本一例
2006/10/09 PHP
PHP4.04简明安装
2006/10/09 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
angular2使用简单介绍
2016/03/01 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
js实现复制粘贴的两种方法
2020/12/04 Javascript
python实现简单的计时器功能函数
2015/03/14 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
keras 读取多标签图像数据方式
2020/06/12 Python
简单了解如何封装自己的Python包
2020/07/08 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
html5.2 dialog简介详解
2018/02/27 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
保险专业自荐信范文
2014/02/20 职场文书
小学校长先进事迹材料
2014/05/13 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
法人委托书的范本格式
2014/09/11 职场文书
初婚未育证明样本
2014/10/24 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
安全生产协议书
2016/03/22 职场文书