如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,称为闭包
    闭包是函数式编程的标配
    闭包 = 外层函数的局部变量 + 内层函数,

    闭包设计的好处就是给外层函数从栈内存里面释放掉了,同时内层函数还能访问到外层函数的变量,

    1. /*
    2. f2方法直接访问f1的变量
    3. 原先需要链式调用,在函数内部传值,
    4. 现在是使用内置函数直接去访问外部函数的局部变量
    5. */
    6. def main(args: Array[String]): Unit = {
    7. // 函数里面包裹函数
    8. def f1(): (Int) => Int = {
    9. var a: Int = 10
    10. def f2(b: Int): Int = {
    11. a + b
    12. }
    13. // 把方法当作返回值时后面加个下划线
    14. f2 _
    15. }
    16. //f1执行完了之后返回f2 ,将f2返回的结果赋值为ff变量
    17. val ff: Int => Int = f1()
    18. println(ff(20)) //输出: 30
    19. println(ff(40)) //输出: 50
    20. }

    f1执行完了之后需要释放掉,不能让f1函数还在栈里面占用我们的资源,f1生命周期延长到f2使用完毕之后死亡,因为f2使用了f1里面的变量a,这种f1和f2形成了一个闭合的效果,这种形式就是闭包
    你声明f1函数的时候此时是不会进入栈的,当你f2调用f1的时候此时f1函数才会进栈.才会被jvm分配栈帧,执行完了f1函数之后只会释放你f1所对应的栈帧里面的内容.