由于scala中函数内部能定义函数,且函数能作为函数的返回值,那么问题来了,当返回的函数使用了外层函数的局部变量时,会发生什么呢?没错,就产生是闭包。

关于闭包的解释网上一大堆,但基本上都是照葫芦画瓢,一个模子刻出来的,说来说去都只讲了“内部函数引用外层函数的局部变量”这个刻板的定义,根本没降到精髓。精髓是什么?且看我一句话给你讲清楚:

闭包就是外层函数函数的对象,外层函数就是闭包的构造函数!

怎么样,是不是摸不着头脑?其实是这样,我们使用闭包的目的并不是为了引用外层函数的局部变量,这只是手段,不是目的;我们的最终目的其实是函数的定制化,即按照一定的模板根据输出生成具有不同功能的函数,其实就是“函数的函数”。这里我们马上可以想到,就相当于“类”的思想,能根据不同的构造函数产生不同的“类的对象”。其实这里就是利用了这种思路,把外层函数当做构造函数,利用传入的参数进行定制,生成具有不同功能的函数并返回。

道理我都懂,但这跟“引用局部变量”有什么关系?很简单呀,比方说外层函数就是一个毛坯房,返回的函数时精装修房,那么外层函数的参数是装修图纸,最终得到的房子肯定是要用到这个图纸或者图纸的衍生物的,因此为了实现定制化,很定要依靠于外层函数的局部变量。

但是这里有个问题:我们都知道,正常来说函数的局部变量是存储在栈内存的,而对象是存储在堆内存的,因此同一个类可能存在多个对象,而函数在执行完成之后栈内存就会释放,因此不会存在多份函数的局部变量。但是根据我们上边的分析,定制化的函数肯定是要用到局部变量的,而且不同的定制化肯定是要保存多份局部变量,且相互之间空间独立的,就如同不同的对象一样。那么scala是怎么解决这个问题的呢?根据这篇文章 https://www.jianshu.com/p/8f24150fad2a 的介绍,scala在生成闭包时使用了一个临时对象来保存外层函数中的局部变量,因此可以算是将当前堆内存中的变量拷贝了一份到栈内存中,因此实现了多份局部空间的并存,以及函数闭包。

最新文章

  1. bzoj1441 MIN
  2. 破解加密PDF文件pdfcrack
  3. Trading
  4. c# 存档修改 读取 写入
  5. php 预定义接口
  6. 算法库:基础线性代数子程序库(Basic Linear Algebra Subprograms,BLAS)介绍
  7. 【转】为什么我说 Android 很糟糕
  8. Oracle sqlplus 语法
  9. 2015网易校招Java开发工程师(技术架构)在线笔试题
  10. 查找附近的wifi密码
  11. JSP EL表达式忽略方法
  12. Grunt + Bower—前端构建利器
  13. Ubuntu系统下的实用软件推荐
  14. JAVAWEB开发环境搭建,附JDK开发环境一键配置批处理bat
  15. 【python】局部变量和全局变量
  16. java中servletContextListener、httpSessionListener和servletRequestListener使用整理
  17. maven 继承
  18. Linux知识(6)----卸载安装的包
  19. hanlp源码解析之中文分词算法详解
  20. 字符串前面加u、r、b的含义

热门文章

  1. 龙珠直播之swot
  2. C#操作CAD-读取和修改数据
  3. tr标签是什么
  4. BIEE入门(三)业务模型层
  5. 在科技圈不懂“机器学习”?那你就out了
  6. ThinkPHP5.0版本的优势在于:
  7. idea打jar包经验总结
  8. Linux下elk安装配置
  9. (转)写的非常好的一篇HTTP协议详解
  10. HDU 1853 MCMF