一分钟简单理解什么是函数闭包(以Scala语言为例)

闭包是一个函数及其引用环境的组合,允许内部函数访问并保持对外部作用域的引用。在Scala示例中,当fun_outer返回fun_inner时,它们共同形成闭包,保存了x的值,即使fun_outer执行完毕。闭包存储在堆中,如果管理不当可能导致内存溢出,依赖GC进行回收。
摘要由CSDN通过智能技术生成

一分钟简单理解什么是函数闭包(以Scala语言为例)

问题引入

在一些编程语言中,函数嵌套使用时,存在这样一种情况:外层函数的生命周期已经结束,而内层函数要访问外层函数中的变量。如果没有函数闭包的支持,这将会存在问题。

以Scala语言为例,试考虑下面这种情况:

object Closure {
  def main(args: Array[String]): Unit = {
    def fun_outer(x: Int): Int => Int = {
      def fun_inner(y: Int): Int = x + y
      fun_inner
    }

    println(fun_outer(1)(2))
  }
}

分析:两个函数嵌套使用,外部函数将内部函数作为返回值,内部函数的函数体内引用了外部函数的参数x

  • 执行到fun_outer(1)时,1赋值给外部形参x
  • fun_outerfun_inner的引用(内存地址)返回
  • fun_outer执行结束,x的作用域结束,销毁
  • 回到主程序后,继续调用fun_outer(1)(2),可以理解为调用fun_inner(2)
  • 此时程序执行x + y时,y的值由参数2提供,但是x的值已经销毁,问题由此出现

那么,如何解决这个问题呢?那就需要闭包的支持了。

什么是闭包

MDN给出的闭包的定义:

闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。

如果用一个公式来概括,闭包 = 函数 + 引用环境

结合前面的例子分析:fun_inner由于引用了fun_outer中的局部变量x,所以xfun_inner共同组成了一个闭包。闭包存储于堆中,即使fun_outer的栈指针已经释放,但闭包的环境仍然保留下来,从而解决了作用域问题。

总结

  • 闭包是函数及其引用环境的组合。
  • 闭包突破了函数作用域的限制,解决了函数内部访问函数外部作用域的情况。
  • 闭包存储于堆中,若滥用且不及时释放空间,可能导致内存溢出。在JVM中,闭包的释放依赖于GC垃圾回收机制。

希望这篇文章让你有所收获,如有错误也欢迎指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan2k

请作者喝一杯咖啡吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值