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 相关文章推荐
JQuery判断radio是否选中并获取选中值的示例代码
Oct 17 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
Nov 20 Javascript
jquery.cookie.js使用指南
Jan 05 Javascript
Juery解决tablesorter中文排序和字符范围的方法
May 06 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
Oct 08 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
Jan 28 Javascript
JS控制HTML元素的显示和隐藏的两种方法
Sep 27 Javascript
关于vue-resource报错450的解决方案
Jul 24 Javascript
详解用node搭建简单的静态资源管理器
Aug 09 Javascript
详解node child_process模块学习笔记
Jan 24 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
Feb 28 Javascript
JS回调函数简单易懂的入门实例分析
Sep 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开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
JS获取父节点方法
2009/08/20 Javascript
js获取class的所有元素
2013/03/28 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
Python网络编程详解
2017/10/31 Python
Python实现的堆排序算法示例
2018/04/29 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
python之array赋值技巧分享
2019/11/28 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
如何利用python发送邮件
2020/09/26 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
墨西哥网上超市:Superama
2018/07/10 全球购物
linux下进程间通信的方式
2014/12/23 面试题
2013年入党人员的自我鉴定
2013/10/25 职场文书
成功的餐厅经营创业计划书
2014/01/15 职场文书
先进事迹报告会感言
2014/01/24 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
史上最牛辞职信
2015/05/13 职场文书