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网页制作特殊效果用随机数
May 22 Javascript
jquery 笔记 事件
Nov 02 Javascript
js实现文件上传表单域美化特效
Nov 02 Javascript
js实现可旋转的立方体模型
Oct 16 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
Dec 08 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
Jan 19 Javascript
js date 格式化
Feb 15 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
Dec 23 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
Apr 18 Javascript
详解微信小程序开发之formId使用(模板消息)
Aug 27 Javascript
使用pkg打包ThinkJS项目的方法步骤
Dec 30 Javascript
AJAX学习笔记
May 18 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设计模式  Command(命令模式)
2011/06/17 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
Javascript 中的 && 和 || 使用小结
2010/04/25 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python基于右递归解决八皇后问题的方法
2015/05/25 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
django中media媒体路径设置的步骤
2019/11/15 Python
python numpy数组中的复制知识解析
2020/02/03 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
Python try except else使用详解
2021/01/12 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
在C#中如何实现多态
2014/07/02 面试题
我的梦想演讲稿500字
2014/08/21 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
自我检讨书怎么写
2015/05/07 职场文书
同事去世追悼词
2015/06/23 职场文书
如何正确理解python装饰器
2021/06/15 Python
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL