亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

大佬們遇到過這個問題嗎?閉包占用的內存可以被釋放嗎?求老司機指點!

大佬們遇到過這個問題嗎?閉包占用的內存可以被釋放嗎?求老司機指點!

神不在的星期二 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 關注
  • 466 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號