闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值。考虑下面的一块使用匿名函数的代码:
- val multiplier = (i:Int) => i * 10
在这里,在函数体中使用的唯一变量, i * 0, 为i,其被定义为一个参数的函数。现在,让我们来看另一块代码:
- val multiplier = (i:Int) => i * factor
有两个自由变量的乘数:i和factor。其中一个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
- C:/>
上面的函数引用factor并读取每个时间的当前值。如果函数没有外部引用,那么它就是封闭了自己。无需外部环境是必需的。