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 相关文章推荐
扩展easyui.datagrid,添加数据loading遮罩效果代码
Nov 02 Javascript
基于jQuery的简单的列表导航菜单
Mar 02 Javascript
Highcharts 非常实用的Javascript统计图demo示例
Jul 03 Javascript
JavaScript 和 Java 的区别浅析
Jul 31 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
May 07 Javascript
jQuery实现不断闪烁文字的方法
May 15 Javascript
javascript仿百度输入框提示自动下拉补全
Jan 07 Javascript
AngularJS 遇到的小坑与技巧小结
Jun 07 Javascript
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
vue elementUI 表单校验功能之数组多层嵌套
Jun 04 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
Aug 14 Javascript
Webpack5正式发布,有哪些新特性
Oct 12 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自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
python映射列表实例分析
2015/01/26 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
Python字典实现伪切片功能
2020/10/28 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
公司离职证明范本
2014/01/13 职场文书
初三开学计划书
2014/04/27 职场文书
如何写求职信
2014/05/24 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
创业计划书之农家乐
2019/10/09 职场文书
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python