闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值。

 假设,我们想写一个函数 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的值,这一过程可以被理解为做对函数执行“关闭”操作,所以叫闭包。