如何理解闭包closure? 以及使用场景

111 views
Skip to first unread message

Alex Wang

unread,
Apr 28, 2015, 5:47:00 AM4/28/15
to cn-clojure
一、问题。
1. 断断续续的在接触closure一直不是很理解,也不太明白closure使用这个到底有什么特别的作用,请明白的同学能否给一个容易理解的说明?(尝试着用费曼技术来通俗易懂的解释出来,比如:“closure解决了什么问题?”,“如果没有这个,什么什么将很难实现”,或者“在java里就很难实现什么什么”等,没有一个直观的说明或比较确实有点一头雾水的感觉。)
2. 我的直观理解就是:“这就是一个全局变量”,这个理解对吗? 有什么问题?
3. 或者还有哪些资料对于更好的理解closure有帮助?


二、来自wikipedia的解释:

定义􏰂 

闭包􏰃Closure􏰄是词法闭包􏰃Lexical Closure􏰄的简称􏰅是引用 了自由变量的函数􏰂这个被引用的自由变量将和这个函数一同存在􏰅即使已经离 开了创造它的环境也不例外􏰂所以􏰅有另一种说法认为闭包是由函数和与其相关 的引用环境组合而成的实体􏰂闭包在运行时可以有多个实例􏰅不同的引用环境和 相同的函数组合可以产生不同的实例􏰂

闭包的用途

因为闭包只有在被调用时才执行操作􏰅即惰性求值􏰅所以它可以被用来 定义控制结构􏰂例如􏰁在Smalltalk语言中􏰅所有的控制结构􏰅包括分歧 条件(if/then/else)和循环(whilefor)􏰅都是通过闭包实现的􏰂用 户也可以使用闭包定义自己的控制结构􏰂

闭包可以用来实现对象系统􏰂

闭包的实现. 典型实现方式是定义一个特殊的数据结构􏰅保存了函数地址指针与 闭包创建时的函数的词法环境表示􏰃那些nonlocal变量的绑定􏰄􏰂使用函数调 用栈的语言实现闭包比较困难􏰅因而这也说明了为什么大多数实现闭包的语言是 基于垃圾收集机制􏰂 闭包的实现与函数对象很相似􏰂这种技术也叫做lambda lifting􏰂 。


三、在the joy of clojure中看到了如下几种用法:

  • close over something mutable: 

  • Functions returning closures
  • Closing over parameters
  • Passing closures as functions
  • Sharing closure context

四、The functional programming for the rest of us的解释:
乍⼀一看这些本地变量已经不再受限于基本的域限制并拥有⽆无限的⽣生命周期了。于是可以得出⼀一个很明显的结论:它们已经不是存在栈上,⽽而是堆上了。这么说来closure的实现和前⾯面讨论过的函数差不多,只不过closure多了⼀一个额外的引⽤用指向其外部的变量⽽而已。

当closure需要访问不在它本地域的变量时,就可以通过这个引⽤用到更外⼀一层的⽗父域中寻找该变量。谜底揭开了!closure将函数编程与⾯面向对象的⽅方法结合了起来。下⼀一次为了保存并传递某些状态⽽而创建类的时
候,想想closure。它能在运⾏行时从相应的域中获得变量,从⽽而可以把该变量当初“成员变量”来访问,也因为这样,就不再需要去创建⼀一个成员变量了。



以上。



崔钢

unread,
Apr 28, 2015, 6:03:50 AM4/28/15
to cn-cl...@googlegroups.com
在我看来,闭包一个作用其实和面向对象的类有些相似,可以用来封装一些数据。不过这些是JS上面的经验,在clojure里面可能并不适用。

--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了Google网上论坛上的“CN-Clojure”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到cn-clojure+...@googlegroups.com
要发帖到此群组,请发送电子邮件至cn-cl...@googlegroups.com
访问此群组:http://groups.google.com/group/cn-clojure
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/cn-clojure/CAM-tmE-h_7WxVXJ32H1LN%2BjrvwN93thaR%2Bj_4F351vem7Qx6rA%40mail.gmail.com
要查看更多选项,请访问https://groups.google.com/d/optout



--
May the force be with you.
Reply all
Reply to author
Forward
0 new messages