2017-07-15 22 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继承的新对象。