如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,称为闭包
闭包是函数式编程的标配
闭包 = 外层函数的局部变量 + 内层函数,
闭包设计的好处就是给外层函数从栈内存里面释放掉了,同时内层函数还能访问到外层函数的变量,
/*
f2方法直接访问f1的变量
原先需要链式调用,在函数内部传值,
现在是使用内置函数直接去访问外部函数的局部变量
*/
def main(args: Array[String]): Unit = {
// 函数里面包裹函数
def f1(): (Int) => Int = {
var a: Int = 10
def f2(b: Int): Int = {
a + b
}
// 把方法当作返回值时后面加个下划线
f2 _
}
//f1执行完了之后返回f2 ,将f2返回的结果赋值为ff变量
val ff: Int => Int = f1()
println(ff(20)) //输出: 30
println(ff(40)) //输出: 50
}
f1执行完了之后需要释放掉,不能让f1函数还在栈里面占用我们的资源,f1生命周期延长到f2使用完毕之后死亡,因为f2使用了f1里面的变量a,这种f1和f2形成了一个闭合的效果,这种形式就是闭包
你声明f1函数的时候此时是不会进入栈的,当你f2调用f1的时候此时f1函数才会进栈.才会被jvm分配栈帧,执行完了f1函数之后只会释放你f1所对应的栈帧里面的内容.