2017-07-15 58 views
0

假設我們有一個對象池(又名數組)。然後我們Constructor.apply(obj,arguments)。Javascript GC應用現有對象

var obj = objectPool[nextAvailableIndex]; 
    obj.index = nextAvailableIndex; 
    nextAvailableIndex += 1; 
    Constructor.apply(obj, arguments); 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

這對現有的Obj有什麼影響?內存是否被重用?這是否有助於避免GC?它是不是基本上與新的一樣,還是相似但不同?

回答

1

假設我們考慮的代碼片段是這樣的:

function Constructor() { 
    this.prop = "some_value"; 
} 
var objectPool = [{}, {}, {}]; 
var nextAvailableIndex = 0; 
function Caller() { 
    var obj = objectPool[nextAvailableIndex]; 
    obj.index = nextAvailableIndex; 
    nextAvailableIndex += 1; 
    Constructor.apply(obj, arguments) 
} 

在這種情況下,當來電被稱爲然後每次新的本地變量中創建一個名爲「OBJ」,但在執行的來電後,即變量被釋放。

就是這樣。

+0

我應該把更多的代碼放在這裏。這是一個對象池。假設pool [100]不再需要,我們想重用它。所以var obj = pool [100]; ...; constructor.apply(obj,arguments);然後我們把obj放回池中[100]。需要回答的問題是:1)新的vs適用的,我們要重複使用記憶,還是要創造新的東西。如果是這樣,那麼對象池是一個沒用的想法,因爲它在應用時不會阻止GC。我沒有回答我的問題。也許我的糟糕,但似乎重新解釋的問題。 – FreddyNoNose

+1

如果你使用'apply',那麼每次都使用同一個對象,但是每當你使用'new'時,就會創建一個新的對象。在這種情況下,如果您將obj放回池中,那麼您將重新使用內存,但是如果您具有零池的引用,那麼該池將被垃圾收集。 –

+0

謝謝。我也曾想過,但是我發佈前一天的一位朋友說服我錯了。猜猜我對自己的信仰失去了信心。 – FreddyNoNose

0

這對現有的Obj有什麼影響?

它調用就可以了Constructor,其設置爲objthis值。什麼Constructor做我們不知道,但總的來說,它應該初始化一個新的實例。

內存是否被重用?

部分取決於Constructor的作用,以及它如何處理非新鮮實例。但是,是的,obj從未發佈,因爲它保留在objectPool陣列中,與new Constructor(…)不同,沒有實例化從Constructor.prototype繼承的新對象。