2016-02-13 33 views
0

說我有這樣的:引用成員是否阻止父對象上的GC?

function getMember() { 

    var myRoot = { 
     a: {val: 1}, 
     b: {val: 2} 
    }; 

    return myRoot.a; 
} 

var myMember = getMember(); 

如何JavaScript的處理myRoot對象時,它超出範圍後?即使存在對myRoot.a的實時參考,它是否會(及其「剩餘」成員myRoot.b)被垃圾收集?

回答

0

引用成員是否阻止父對象上的GC?

除非該構件具有圓形參考回父對象,或包含/是封閉在它當然的功能,但在這裏,這不是這種情況。

V8在超出範圍後如何處理myRoot對象?

它會像每隔一個對象一樣對待。 myRoot變量將超出範圍,並且該對象將不再被任何引用,因此它有資格進行垃圾回收。

它甚至可能已經存儲在堆棧上,這意味着當函數返回時,它的內存立即被重新聲明。

即使存在對myRoot.a的實時引用,它(和其「剩餘」成員myRoot.b)是否會被垃圾收集?

是的。該參考不是針對「myRoot.a」,而是針對堆上的對象{val: 1}。它沒有附加名稱。

相關問題