以下是闭包的一些解释。对我来说,“tiger book”中的那个最能令我满意……比喻也有很大帮助,但只有在遇到这一个之后才有用……
- 闭包:在集合论中,闭包是一个(最小的)集合,在该集合上执行某些操作的结果也属于该集合,因此它是“在某些操作下最小的封闭社会”。
a) SICP:在抽象代数中,如果将操作应用于集合中的元素产生的结果仍然是集合中的元素,则称元素集合在该操作下是封闭的。Lisp 社区也不幸地使用“闭包”一词来描述一个完全不相关的概念:闭包是一种表示具有自由变量的过程的实现技术。
b) 维基百科:闭包是一个捕获其定义环境中自由变量的词法绑定的一等函数。一旦捕获了词法绑定,该函数就成为闭包,因为它“闭合”了那些变量。
c) 老虎书:堆上的数据结构(而不是栈上),其中包含函数指针(MC)和环境指针(EP),表示函数变量;
d) 在Lisp中,函数和一组变量绑定的组合被称为闭包;闭包是具有本地状态的函数;
e) Google I/O视频:类的实例类似于封装代码(vtab)的数据(instance obj),而在闭包的情况下,代码(函数变量)封装了数据。
f) 封装的数据对函数变量是私有的,这意味着闭包可用于数据隐藏。
g) 非函数式编程语言中的闭包:在C中使用带cookie的回调是一个类似的结构,还有glib“closure”:glib闭包是封装类似事物的数据结构:信号回调指针、cookie私有数据和闭包的析构函数(因为C中没有GC)。
h) 老虎书: "高阶函数"和"嵌套函数作用域"需要解决这样一个问题:父函数返回引用其父作用域中的变量的子函数,这意味着即使父级返回作用域中的变量也不能从堆栈中弹出...解决方案是在堆中分配闭包。
i) Greg Michaelson ($10.15):(在lisp实现中)闭包是一种标识自由变量和词法绑定变量之间关系的方式,当需要将自由变量冻结为定义范围中的值并返回函数值时(通常需要)。
j) 历史和词源学:Peter J. Landin于1964年定义了闭包这个术语,作为他的SECD机器用于评估表达式的环境部分和控制部分。 Joel Moses归功于Landin引入闭包这个术语,以指代一个λ表达式,其开放绑定(自由变量)已经通过词法环境关闭(或绑定),从而形成一个封闭的表达式或闭包。这种用法随后被Sussman和Steele在1975年定义Scheme时采用,并得到广泛应用。
return null
的人一样。你不必返回任何东西来完成函数。只需关闭它即可 :P - DaGLiMiOuX