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 相关文章推荐
js中parseFloat(参数1,参数2)定义和用法及注意事项
Jan 27 Javascript
jQuery实现动画效果的简单实例
Jan 27 Javascript
JavaScript基础教程之alert弹出提示框实例
Oct 16 Javascript
jquery ui bootstrap 实现自定义风格
Nov 14 Javascript
JQuery中$.each 和$(selector).each()的区别详解
Mar 13 Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 Javascript
AngularJs定时器$interval 和 $timeout详解
May 25 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 Javascript
微信小程序实现animation动画
Jan 26 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 Javascript
element-ui封装一个Table模板组件的示例
Jan 04 Javascript
使用Cargo工具高效创建Rust项目
Aug 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
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
jQuery ajax实现省市县三级联动
2021/03/07 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
Angular5集成eventbus的示例代码
2018/07/19 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
vue实现评价星星功能
2020/06/30 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
python爬虫用mongodb的理由
2020/07/28 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
暑期实习鉴定
2013/12/16 职场文书
思想汇报格式
2014/01/05 职场文书
办公室主任职责范本
2014/03/07 职场文书
学习交流会主持词
2014/04/01 职场文书
户籍证明模板
2014/09/28 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
Python列表的索引与切片
2022/04/07 Python