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 textarea的长度进行验证
May 06 Javascript
得到form下的所有的input的js代码
Nov 07 Javascript
js正则表达exec与match的区别说明
Jan 29 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
深入浅出ES6之let和const命令
Aug 25 Javascript
AngularJS通过$location获取及改变当前页面的URL
Sep 23 Javascript
JS中数组重排序方法
Nov 11 Javascript
jQuery实现 上升、下降、删除、添加一行代码
Mar 06 Javascript
详解angularjs 关于ui-router分层使用
Jun 12 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
Aug 12 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
Oct 20 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 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 页面编码声明方法详解(header或meta)
2010/03/12 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
深入php list()函数的详解
2013/06/05 PHP
php计算整个目录大小的方法
2015/06/19 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
python实现ip查询示例
2014/03/26 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
Dockers美国官方网站:卡其裤、男士服装、鞋及配件
2016/11/22 全球购物
《再见了,亲人》教学反思
2014/02/26 职场文书
社团活动总结范文
2014/04/26 职场文书
医院搬迁方案
2014/06/14 职场文书
图书室标语
2014/06/21 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
刘胡兰观后感
2015/06/16 职场文书
遗失证明范文
2015/06/19 职场文书
python字典的元素访问实例详解
2021/07/21 Python