闭包(Closure)是引用了自由变量的函数,它的返回值依赖于这个函数外部的一个或者多个变量。
闭包本身类,它的特点是它所创建的对象实例可以引用外部函数/类里面的变量。 即闭包就是能够读取外部函数的内部变量的函数。
如下面这段匿名的函数:
val multiplier = (i:Int) => i * 10
在这个函数体内有一个变量i,它作为函数的一个参数。如下面的另一段代码:val multiplier = (i:Int) => i * factor
在multiplier中有两个自由变量:i和factor。其中的一个i为函数的形式参数,每次multiplier被调用时,i被赋予一个新的值。然而,factor不是形式参数,那它是什么呢?考虑下面代码:var factor = 3
val multiplier = (i:Int) => i * factor
factor有一个在函数的外边的变量的引用,但是在一个封闭的作用域内。如下边示例:object Test {
def main(args: Array[String]) {
println( "muliplier(1) value = " + multiplier(1) )
println( "muliplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
当以上代码被编译执行后,产生如下结果:C:/>scalac Test.scala
C:/>scala Test
muliplier(1) value = 3
muliplier(2) value = 6
上面的函数引用了factor,并每次读取它当前的值。如果一个函数没有外部变量,那么它就平凡地被封闭,不需要外部环境。