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 获取图片颜色
Apr 05 Javascript
JS异常处理的一个想法(sofish)
Mar 14 Javascript
JavaScript中把数字转换为字符串的程序代码
Jun 19 Javascript
深入理解jquery跨域请求方法
May 18 Javascript
BootStrap中Table分页插件使用详解
Oct 09 Javascript
js正则表达式验证表单【完整版】
Mar 06 Javascript
angular.JS实现网页禁用调试、复制和剪切
Mar 31 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
Echarts基本用法_动力节点Java学院整理
Aug 11 Javascript
详解vue-cli构建项目反向代理配置
Sep 07 Javascript
小程序scroll-view组件实现滚动的示例代码
Sep 20 Javascript
使用javascript解析二维码的三种方式
Nov 11 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的memcached客户端memcached
2011/06/14 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
javascript如何实现create方法
2019/11/04 Javascript
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
python实现石头剪刀布小游戏
2021/01/20 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
在notepad++中实现直接运行python代码
2019/12/18 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
工艺工程师工作职责
2013/11/23 职场文书
商业活动邀请函
2014/02/04 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
纠纷协议书
2014/04/16 职场文书
教师节慰问信
2015/02/15 职场文书
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
DSP接收机前端设想
2022/04/05 无线电