FP - Pure function vs. Closure
闭包(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变量的参考,因此被称为闭包。
原文:http://my.oschina.net/Barudisshu/blog/523461