下面是关闭的解释集合。对我来说,最让我满意的是《虎书》里的那本……比喻的也有很大帮助,但只有遇到了这本……
- 闭包:在集合论中,闭包是一个(最小的)集合,一些运算产生的结果也属于这个集合,所以它有点像“某些运算下的最小封闭社会”。
a) sicp:在抽象代数中,如果对集合中的元素应用操作,则称该集合在操作下是闭合的,产生的元素又是集合中的一个元素。Lisp 社区也(不幸地)使用“闭包”这个词来描述一个完全不相关的概念:闭包是一种用于表示具有自由变量的过程的实现技术。
b) wiki:闭包是第一类函数,它在其定义环境中捕获自由变量的词法绑定。一旦它捕获了词法绑定,该函数就变成了一个闭包,因为它“关闭”了这些变量。”</p>
c) 老虎书:堆上(而不是栈上)的数据结构,包含函数指针(MC)和环境指针(EP),表示一个函数变量;
d) 在 lisp 上:一个函数和一组变量绑定的组合称为闭包;闭包是具有本地状态的函数;
e) google i/o video:类似于一个类的实例,其中数据(instance obj)封装了代码(vtab),而在闭包的情况下,代码(函数变量)封装了数据。
f) 封装的数据对函数变量是私有的,意味着闭包可以用于数据隐藏。
g) 非函数式编程语言中的闭包:C 中带有 cookie 的回调是类似的结构,也是 glib“闭包”:glib 闭包是封装类似事物的数据结构:信号回调指针,cookie 是私有数据,以及闭包的析构函数(因为 C 中没有 GC)。
h)老虎书:“高阶函数”和“嵌套函数范围”一起需要一个解决方案,即爸爸函数返回一个孩子函数,该函数引用其父亲范围内的变量,这意味着即使父亲也返回变量它的范围不能从堆栈中“弹出”......解决方案是在堆中分配闭包。
i)Greg Michaelson(10.15 美元):(在 lisp 实现中),闭包是一种识别自由变量和词法绑定变量之间关系的方法,当有必要(经常需要)返回一个函数值时,将自由变量冻结为来自定义范围。
j) 历史和词源:Peter J. Landin 在 1964 年将术语闭包定义为具有环境部分和控制部分,由他的 SECD 机器用于评估表达式。Joel Moses 认为 Landin 引入了闭包一词来指代一个 lambda 表达式,其开放绑定(自由变量)已被词法环境封闭(或绑定),从而导致封闭表达式或闭包。这种用法随后被 Sussman 和 Steele 在 1975 年定义 Scheme 时采用,并被广泛使用。