閉包是一個(gè)函數(shù),它返回值取決于在此函數(shù)之外聲明的一個(gè)或多個(gè)變量的值。
以下代碼是一個(gè)匿名函數(shù)。
val multiplier = (i:Int) => i * 10
這里,函數(shù)體i * 10中使用的唯一變量是i,它被定義為該函數(shù)的一個(gè)參數(shù)。嘗試以下代碼 -
val multiplier = (i:Int) => i * factor
乘數(shù)有兩個(gè)自由變量:i和factor。i是函數(shù)的一個(gè)正式參數(shù)。 因此,每當(dāng)調(diào)用乘數(shù)時(shí),它必然會(huì)有一個(gè)新的值。然而,factor不是一個(gè)正式的參數(shù),那這是什么呢? 再增加一行代碼。
var factor = 3
val multiplier = (i:Int) => i * factor
現(xiàn)在factor參考了函數(shù)之外的變量,但是在閉合的范圍內(nèi)。函數(shù)引用factor,每次讀取其當(dāng)前值。 如果函數(shù)沒(méi)有外部引用,那么它本身就會(huì)被簡(jiǎn)單地關(guān)閉,不需要外部上下文。
請(qǐng)嘗試以下示例程序 -
例子
object Demo {
def main(args: Array[String]) {
println( "multiplier(1) value = " + multiplier(1) )
println( "multiplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
將上述程序保存在源代碼:Demo.scala中,使用以下命令編譯和執(zhí)行此程序。
D:\>scalac Demo.scala
D:\>scala Demo
multiplier(1) value = 3
multiplier(2) value = 6