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代码
Mar 10 Javascript
window.dialogArguments 使用说明
Apr 11 Javascript
基于jquery的滚动鼠标放大缩小图片效果
Oct 27 Javascript
Extjs优化(一)删除冗余代码提高运行速度
Apr 15 Javascript
推荐25个超炫的jQuery网格插件
Nov 28 Javascript
iframe跨域通信封装详解
Aug 11 Javascript
浅谈jquery中使用canvas的问题
Oct 10 Javascript
Bootstrap Modal遮罩弹出层(完整版)
Nov 21 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
Jan 03 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
Feb 07 Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 Javascript
vue组件中传值EventBus的使用及注意事项说明
Nov 16 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中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
js转html实体的方法
2016/09/27 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
python中的编码知识整理汇总
2016/01/26 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
Python 代码调试技巧示例代码
2020/08/11 Python
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
桥梁工程专业求职信
2014/04/21 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
管理人员岗位职责
2015/02/14 职场文书
商务宴会祝酒词
2015/08/11 职场文书
小学感恩主题班会
2015/08/12 职场文书
入党申请书怎么写?
2019/06/21 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
基于Python实现流星雨效果的绘制
2022/03/18 Python
MySQL分区路径子分区再分区
2022/04/13 MySQL