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 相关文章推荐
23个Javascript弹出窗口特效整理
Feb 25 Javascript
读jQuery之一(对象的组成)
Jun 11 Javascript
js如何实现设计模式中的模板方法
Jul 23 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
jquery cookie的用法总结
Nov 18 Javascript
jQuery.holdReady()使用方法
May 20 Javascript
jQuery手机拨号界面特效代码分享
Aug 27 Javascript
使用jQuery给input标签设置默认值
Jun 20 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
JavaScript门道之标准库
May 26 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
Oct 29 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函数
2006/10/09 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
php发送与接收流文件的方法
2015/02/11 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
javascript &&和||运算法的另类使用技巧
2009/11/28 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
js prototype深入理解及应用实例分析
2019/11/25 Javascript
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Python正则表达式知识汇总
2017/09/22 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
使用python远程操作linux过程解析
2019/12/04 Python
python实现TCP文件传输
2020/03/20 Python
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
国际会计专业求职信
2014/08/04 职场文书
殡葬服务心得体会
2014/09/11 职场文书
诉讼授权委托书
2014/10/15 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
Python字典和列表性能之间的比较
2021/06/07 Python