闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即便已经离开了创造它的环境也不例外。 闭包
定义:闭包名称源自于经过“捕获”自由变量的绑定,从而对函数字面量执行的“关闭”行动。不带自由变量的函数字面量,如:(x:Int) => x + 1,被称为封闭项(closed term),这里项(term)指的是一小部分源代码。所以依照这个函数字面量在运行时建立的函数值严格意义上来说就不是闭包,由于(x:Int) => x + 1在编写的时候就已经封闭了。但任何带有自由变量的函数字面量,如:(x:Int) => x + more,都是开放项(open term)。所以,任何以(x:Int) => x + more为模板在运行期建立的函数值将必须捕获对自由变量more的绑定。所以获得的函数值将包含指向捕获的more变量的索引。又因为函数值是关闭这个开放项(x:Int) => x + more行动的最终产物,所以被称为闭包。 函数
1. 如(x: Int) => x + 1匿名函数,x做为参数是已知的,整个表达式构成 封闭术语,函数在运行时就已经封闭的,根据引用透明的定义(一个表达式能够被自身结果替代[第一类值]而不影响程式),而纯函数的定义是——单例的引用透明表达式,因此不包含自由变量的函数就是纯函数。 索引
2. 包含一个或多个自由变量,如(x: Int) => x + more,其中more就是自由变量,more只有在运行期才肯定它的值,即惰性求值,因为函数值是关闭这个[开放术语] (x: Int) => x + more的行动的最终产物,获得的函数值将包含一个指向捕获的more变量的参考,所以被称为闭包。 模板