Java的视角看闭包以及内存泄漏
|
函数体里的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? 这里了解了二者的实现原理,咱们再来聊一聊二者都会遇到的潜在问题:内存泄漏。 二、内存泄漏 出现内存泄漏的原因也很简单:
我们来看一个比较常见的代码,在一个UI组件里delay一段时间,然后再拿到这个组件里的某个View做delay之后的事情: (编辑:文章分享网_茂名站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



