加入收藏 | 设为首页 | 会员中心 | 我要投稿 文章分享网_茂名站长网 (https://www.0668zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

Java的视角看闭包以及内存泄漏

发布时间:2021-03-31 14:06:14 所属栏目:动态 来源:互联网
导读:函数体里的console.log(i)为什么能引用到i,是因为JS是按作用域查找变量,如果当前作用域没有这个变量就会向父级查找,以此类推。 有了上边两个点,大家应该就能get到为啥arr6的时候,通过父作用域找到了i,而此时的i = 10。 那么问题来了,JS里边怎么让cons

函数体里的console.log(i)为什么能引用到i,是因为JS是按作用域查找变量,如果当前作用域没有这个变量就会向父级查找,以此类推。

有了上边两个点,大家应该就能get到为啥arr6的时候,通过父作用域找到了i,而此时的i = 10。

那么问题来了,JS里边怎么让console.log(i)打印6?答案是:闭包。看一下代码发生了什么改动?用一个有一个参数的函数包了一下。每次for循环的时候都调用这个函数并传递一个当前的i进去。

此后对于console.log(i)来说,父级作用域就是包裹的那个函数,而找到的i也就是正确的i。

这就是JS的闭包。咱们再回忆一下Java是不是也是类似的处理方式?出奇的相似,这里用了一个名为TestKt$main$1的类包裹了我们的Function。并且构造函数里接收我们需要的i。

所以无论上闭包,还是持有外部对象引用。本质想要解决的问题都是:正确的变量引用。这里还有一个题外话:匿名内部类持有外部引用的时候,为啥要加final?

这里了解了二者的实现原理,咱们再来聊一聊二者都会遇到的潜在问题:内存泄漏。

二、内存泄漏

出现内存泄漏的原因也很简单:

  1. 函数内要使用外部变量,那么势必要持有外部变量
  2. 而函数的执行时机有可能在外部变量生命周期外执行
  3. 为了保证2步骤的正常,那么原本应该被回收的外部变量就不能被回收了,因为函数还在引用。所以外部变量就内存泄漏了

我们来看一个比较常见的代码,在一个UI组件里delay一段时间,然后再拿到这个组件里的某个View做delay之后的事情:

(编辑:文章分享网_茂名站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读