持有对象属性的引用是否会阻止对象被垃圾回收?

时间:2014-02-18 17:50:24

标签: javascript memory memory-management memory-leaks garbage-collection

假设我有一个对象:

var o1 = {
    someKey: 'value'
};

和另一个引用第一个对象的对象:

var o2 = {
    o1Ref: o1
};

以及引用第一个对象上的属性的第三个对象:

var o3 = {
    o1propRef: o1.someKey
};

然后,假设o2被垃圾收集。 o1.someKeyo3的引用是否会阻止o1被收集?

然后,假设o1更大,请说:

var o1 = {
    someKey: 'value',
    someBigValue: Buffer(2000000)
};

可以收集未被引用的o1部分,还是作为整体收集的对象?看起来,使用o1的第二个版本,o3只是暂时保留o1.someKeyo1.someBigValue可以被释放。

另外,我确实意识到这可能因实现而异。如果是这样的话,那么最常思考这个问题的方法是什么?

1 个答案:

答案 0 :(得分:3)

  

o1.someKey o3的引用是否会阻止o1被收集?

不,因为没有一个(参考)。在创建对象时,您有{{1>}的副本,而不是对o1.someKey属性的引用。 (JavaScript除了对象之外没有任何引用;所以没有属性引用,只有对象引用。)

你可以看到你只是通过玩它来获得初始化的值:

o1.someKey

要让var o1 = { someKey: 'value' }; var o3 = { o1propRef: o1.someKey // (It's not a property reference, it's a copy of the value, but I left the name alone) }; console.log(o3.o1propRef); // "value" o1.someKey = "updated value"; console.log(o3.o1propRef); // "value" console.log(o1.someKey); // "updated vale" 阻止o3被垃圾回收,o1必须引用o3(或某些内容反过来引用它)。只是从o1获取值根本不会建立任何类型的引用关系。