闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值。
假设,我们想写一个函数 f(x) ,该函数的返回值取决于变量 i 。伪代码为
f(x) = x + i
我们尝试着写写这个函数
scala> def f(x : Int) = x + i:10: error: not found: value i def f(x : Int) = x + i
很明显,i 没有声明,那么能不能先声明变量i,再定义函数呢?
在scala中,定义一个变量,必须初始化。
scala> var i : Int:10: error: only classes can have declared but undefined members(Note that variables need to be initialized to be defined) var i : Int
一旦初始化了,那么上面的函数也就不依赖于变量i了。
scala中提供了如下的写法
def f(x:Int) = (i : Int) => (x+i)
此时函数就依赖于i,并且i的值是未知的。
示例代码如下:
object ClosureOps { def main(args: Array[String]): Unit = { def f(x:Int) = (i : Int) => (x+i) val a = f(1) val b = f(2) println(a(10)) println(b(20)) }}
即函数值若想被创建必须捕获i的值,这一过程可以被理解为做对函数执行“关闭”操作,所以叫闭包。