为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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

TA贡献1843条经验 获得超7个赞

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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信