為什么循環引用會導致“內存泄漏”


首先這個問題對於現代瀏覽器(IE9+)來說已經不是問題了,這個問題其實是出現在IE8的時代了

我們主要是通過這個問題來介紹下瀏覽器的垃圾回收機制:

js是有自己的一套自動垃圾回收機制的,這是大部分高級語言都具備的(除了c語言),然而它的機制是什么呢?

采用過的有2種  標記清除 和  引用計數

先明確一點現代瀏覽器采用的是標記清除

舉個栗子:

function test(){
 var a = 10 ; //被標記 ,進入環境 
 var b = 20 ; //被標記 ,進入環境
}
test(); //執行完畢 之后 a、b又被標離開環境,被回收。

是否回收的准則是是否離開環境

而老瀏覽器采用的是引用計數

舉個栗子:

function test(){
 var a = {} ; //a的引用次數為0 
 var b = a ; //a的引用次數加1,為1 
 var c =a; //a的引用次數再加1,為2
 var b ={}; //a的引用次數減1,為1
}
//test執行完后,全部變量會自動定義為undefined
//c = undefined后a的引用次數也變為0了

然而這種機制有個很嚴重的bug——循環引用

function fn() {
 var a = {};
 var b = {};
 a.pro = b; //a引用次數為1
 b.pro = a;//b引用次數為1
}
//fn調用結束后,a=undefined,b=undefined
//這樣並沒有使得a和b的引用次數減少
//因為引用a和b的並不是b和a的本身,而是他們的屬性
//所以面對這種循環引用的狀況,自動回收是沒辦法把引用次數降到0的
//這個時候要我們手動在結尾那添加a.pro = undefined;b.pro = undefined

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM