atitit.闭包的概念与理解attilax总结v2 qb18.doc
atitit.闭包的概念与理解attilax总结v2 qb18.doc
1.1. 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。1
2. #----闭包(Closures)的原理2
2.1. Atitti java预定义函数式接口 闭包的实现5
2.2. Atitit,闭包的原理以及与函数回调的区别5
1.1. 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。
这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
所以,一个闭包就是一个“捕获”或“携带”了其被生成的环境中、所属的变量范围内所引用的所有变量的函数。
当我们执行action时,它输出了我们预期的结果。请注意,当我们执行时,原始的“x”此时已经脱离了它当初的变量环境,但它仍然能用。
当你在代码调试器(debugger)里观察“action”时,会发现很有趣的事情。我们可以看到,C#编译器为我们创建了一个Target类,里面封装了x变量:
闭包(和higher order functions)都是非常有用的东西。如果你曾经开发过稍微复杂一点的Javascript程序,你可能就会知道,这个东西可以被当成很多面向对象特征的替代品,就像C#那样。前不久我还在C#里写了一个例子来验证这种想法。
1.1.1. 闭包是因为JS的一些语言特性而形成的,所以在谈它之前我们首先要了解一下的知识点
1.1.1.1.1. 1.执行上下文
1.1.1.1.2. 2.作用域
1.1.1.1.3. 3.垃圾回收机制
1.1.1.1.4. 4.函数嵌套
2. #----闭包(Closures)的原理
在复杂的应用中,我们一定会遇到这类场景。即在函数运行时需要访问函数定义时的上下文数据(注意:一定要区分函数定义时和函数运行时两个不同的时 刻)。特别是在异步编程模型中,函数的定义和运行又分处不同的时间段,那么保持上下文的问题变得更加突出了。因为我们在任务执行一半时把资源交出去没有问 题,但当任务需要再次继续时我们必须还原现场。
在这个例子中,db.query作为一个公共的数据库查询方法,把"id"这个业务数据传入给db.query,交由其保存是不太合适的。但我们可 以稍作抽象,让db.query再支持一个需要保持状态的数据对象传入,当数据查询完毕后可以把这些状态数据原封不动的回传。如下:
Js代码:
function main(){
var id = "1";
var currentState = new Object();
currentState.person_id = id;
db.query("select name from persons where id=" + id, function(name,state){
output("person id:" + state.person_id + ", name:" + name);
},currentState);//注意currentState是db.query的第三个参数
}
main();
记住这种重要的思路,我们再看看是否还能进一步的抽象?可以的,不过接下的动作之前,我们还要了解在JavaScript中一个函数也是一个对象。 一个函数实例fn除了函数体的定义之外,我们仍然可以在这个函数对象实例之本身扩展其他属性,如fn.a=1;受到这个启发我们尝试把需要保持的状态直接 绑定到函数实例上:
Js代码
function main(){
var id = "1";
var currentState = new Object();
currentState.person_id = id;
function onDataLoad(name){
output("person id:" + onDataLoad.state.person_id + ", name:" + name);
}
onDataLoad.state = currentState ;//为函数指定state属性,用于保持状态
db.query("select name from persons where id=" + id, onDataLoad);
}
我们做了什么?生成了currentState对象,然后在函数onDataLoad定义时,将currentState绑定给 onDataLoad这个函数实例。那么在onDataLoad运行时,就可以拿到定义时的state对象了。JavaScript的闭包特性就是内置了 这个过程而已。
在每个JavaScript函数运行时,都有一个运行时内部对象称为Execution Context,它包含如下Variable Object(VO,变量对象), Scope Chain(作用域链)和"this" Value三部分。如图:
图片来自ECMA-262 JavaScript .The Core
其中变量对象VO,包含了所有局部变量的引用。对于main函数,局部变量"id"存储在VO.id内。看起来用VO来代替我们的 currentSate最合适了。但main函数还可能嵌套在其他函数之内,所以我们需要ScopeChain,它是一个包含当前运行函数VO和其所有父 函数scope的数组。
所以在这个例子中,在onDataLoad函数定义时,就为默认为其绑定了一个[[scope]]属性指向其父函数的 ExecutionContext的ScopeChain。而当函数onDataLoad执行时,就可以通过[[scope]]属性来访问父函数的VO对 象来找到id,如果父函数的VO中没有id这个属性,就再继续向上查找其祖先的VO对象,直到找到id这个属性或到达最外层返回undefined。也正 是因为这个引用,造成VO的引用计数不为0,在走出作用域时,才不会被垃圾回收。
很多朋友觉得闭包较难理解,其实我们只要能明确的区分函数定义和函数运行两个时机,那么闭包就是让函数在运行时能够访问到函数定义时的所处作用域内的所有变量,或者说函数定义时能访问到什么变量,那么在函数运行时通过相同的变量名一样能访问到
2.1. 3. 闭包应用的场景
2.1.0.1. 1. 函数作为返回值
2.1.0.2. 2.函数作为参数被传递
2.2. Atitti java预定义函数式接口 闭包的实现
Jdk7使用匿名类与方法实现闭包
2.3. Atitit,闭包的原理以及与函数回调的区别
2.3.1. 闭包对异步编程模型是非常重要的,简单说就是“回调”,你说C的函数指针也是回调的方式,没错,但是参数传递会要了你的命!闭包能够自动“捕获”上下文变量是非常方便的。
现代语言的几个特征,闭包(Closure),运算符重载,自动内存管理这回Swift解决的比Java还完美,闭包自动捕获(Capture)上下文变量,是可以修改变量值的哦(Java印象中是只读捕获)!
参考
闭包.doc 这个可以dep了。。
一波水文来袭-让我们一起谈谈闭包 - 一半水一半冰 - 博客园.html
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
Atiend
atitit.闭包的概念与理解attilax总结v2 qb18.doc相关推荐
- Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx 1. Keyword关键词 1 2. 靓号的定义 1 3. 靓号的重要意义 与解决问题 为什么我们需要靓号指南, ...
- 深入理解Lua的闭包:概念和应用
深入理解Lua的闭包一:概念和应用_cbbbc的博客-CSDN博客 本文首先通过具体的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理. 闭包的概念 在Lua中 ...
- Atiitt 可视化 报表 图表之道 attilax著 Atiitt 可视化的艺术 attilax著 v2 s51.docx Atitit.可视化与报表原理与概论 1. 、什么是可视化(这一
Atiitt 可视化 报表 图表之道 attilax著 Atiitt 可视化的艺术 attilax著 v2 s51.docx Atitit.可视化与报表原理与概论 1. .什么是可视化(这一节有点 ...
- Atitit.java swing打印功能 api attilax总结
Atitit.java swing打印功能 api attilax总结 1. 打印方式有三种:2 1.1. 一是不经过任何修改,直接调用javascript中的window.print()打印.2 ...
- 闭包的概念、作用、问题及解决方式
闭包(closure) **概念:**有权访问另一个函数作用域中变量的函数 **作用:**延伸变量的作用范围 特殊点: 代码中的变量分为两种:全局变量和局部变量,全局变量可以提供给全局所用函数使用,而 ...
- 闭包的概念,作用,和优缺点
闭包的概念 闭包就是能读取其他函数内部变量的函数. 也可以简单的理解为:"定义在一个函数内部的函数" 闭包的形式 //在执行fn1时,其返回值是一个函数,即fn2,所以再一次执行的 ...
- 从λ演算到函数式编程聊闭包(2):彻底理解JavaScript闭包规则
闭包是很多语言都具备的特性,上篇<从抽象代数漫游函数式编程(1):闭包概念再Java/PHP/JS中的定义> 闭包的特性 闭包有三个特性: 函数嵌套函数 函数内部可以引用外部的参数和变量 ...
- Atitit 学习方法 补充 艾龙 著 attilax著 1. Atitit 学习的方法 attilax总结 1 1.1. 2. 基于学习策略的分类 2机械 示教 演绎 类比 解释 归纳 2 1.
Atitit 学习方法 补充 艾龙 著 attilax著 1. Atitit 学习的方法 attilax总结 1 1.1. 2. 基于学习策略的分类 2机械 示教 演绎 类比 解释 归纳 2 1.2 ...
- Spring Security 实战干货: RBAC权限控制概念的理解
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 1 ...
- Atitit 图像处理的心得与疑惑 attilax总结
Atitit 图像处理的心得与疑惑 attilax总结 1.1. 使用类库好不好??还是自己实现算法1 1.2. 但是,如果遇到类库体积太大,后者没有合适的算法,那就只能自己开发算法了1 1.3. 如 ...
最新文章
- putty和Xming server 结合完美在windows下显示linux GUI程序
- 关于数据库内“表”的几点
- sql数据库相关语句
- Eureka-服务发现
- “写代码三年月薪不到一万是不是很失败?”
- 实体框架提供程序类型无法加载?
- POJ 2082Lost Cows
- 论文笔记_S2D.05-2012-ECCV-从立体图像中提取与场景一致的三维对象和深度
- 一步一步学Repast 第四章——分析SimpleModel
- flutter 自带方法获取视频缩略图
- HDMI的DDC是什么
- Android 9 静默安装apk
- Sql Server数据库获取月份英文简写
- 解密微信电脑版image文件夹下缓存的用户图片
- 腾讯会议摄像头黑屏如何解决?
- Caused by: io.netty.resolver.dns.DnsNameResolverTimeoutException: [/192.168.1.1:53] query via UDP ti
- php下载pdf文件不全,关于php:Zip PDF文件下载无效
- 在Ubuntu中运行Exe程序
- 什么专业可以免考计算机二级,计算机二级证书可以免考自考哪些科目?
- 摄像头畸变及厂家畸变表分析