猿问

大佬们遇到过这个问题吗?闭包占用的内存可以被释放吗?求老司机指点!

最近一直迷惑这个问题,身边的大佬说标记-清理垃圾回收机制能够回收闭包占用的内存,我了解后隐隐约约觉得不能回收闭包占用的内存,但是也说不出个所以然来,希望还能有大佬说明下。
我有两个问题:
闭包可以手动释放吗?
在GC里,闭包怎么被判定可以被回收?GC处理闭包是否和普通对象一样。
神不在的星期二
浏览 434回答 2
2回答

慕码人2483693

回答一下吧。其实闭包函数是否可以回收与它的外层函数是无关的,只与是否有引用指向它有关。从这一点上看,闭包函数与普通对象是一样一样儿的。比如说,调用外层函数,里面返回了一个闭包函数,那么这个闭包函数什么时候回收就不再由外层函数决定了,只由接收者如何处理这个函数有关。反而是外层函数可能会受到闭包函数的影响,如果外层函数中的变量被闭包函数引用了,那么这个变量必须等到闭包函数回收后才能回收。

蓝山帝景

这个答案用代码来展开下其他楼各位的回答constfn=function(){letnum=0;returnfunction(){returnnum+=1;}}fn()()//1fn()()//1fn()()//1上面这段代码就是最简单的闭包,如果我们此时在浏览器控制台执行这段代码,那么不管执行多少次,控制台得到的结果都是1,实际上fn就被回收掉了但如果我们这么写constfn=function(){letnum=0;returnfunction(){returnnum+=1;}}letf1=fn();f1();//1f1();//2f1();//3f1=null;f1=fn();f1();//1f1();//2f1();//3此时的f1就是闭包的引用,因此就没法被回收掉然后使f1=null手动解除引用,再重新赋值后就会发现这个时候闭包也被回收掉了
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答