首先這個問題對於現代瀏覽器(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