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高亮效果的二种实现方法
Sep 14 Javascript
JavaScript 精粹读书笔记(1,2)
Feb 07 Javascript
js全选实现和判断是否有复选框选中的方法
Feb 17 Javascript
基于Jquery实现焦点图淡出淡入效果
Nov 30 Javascript
详解JavaScript正则表达式之RegExp对象
Dec 13 Javascript
jquery实现简单的全选和反选功能
Jan 02 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
Mar 07 Javascript
ES6中字符串string常用的新增方法小结
Nov 07 Javascript
vue.js 使用axios实现下载功能的示例
Mar 05 Javascript
vuejs 制作背景淡入淡出切换动画的实例
Sep 01 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 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蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
PHP分享图片的生成方法
2018/04/25 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
DOM精简教程
2006/10/03 Javascript
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
python 运算符 供重载参考
2009/06/11 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Python iter()函数用法实例分析
2018/03/17 Python
python2.7实现邮件发送功能
2018/12/12 Python
Python list运算操作代码实例解析
2020/01/20 Python
基于Python fminunc 的替代方法
2020/02/29 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
abstract class和interface有什么区别?
2012/01/03 面试题
大一新生学期自我评价
2014/04/09 职场文书
《望庐山瀑布》教学反思
2014/04/22 职场文书
加强作风建设工作总结
2014/10/23 职场文书