假设我有一个对象:
var o1 = {
someKey: 'value'
};
和另一个引用第一个对象的对象:
var o2 = {
o1Ref: o1
};
以及引用第一个对象上的属性的第三个对象:
var o3 = {
o1propRef: o1.someKey
};
然后,假设o2
被垃圾收集。 o1.someKey
上o3
的引用是否会阻止o1
被收集?
然后,假设o1
更大,请说:
var o1 = {
someKey: 'value',
someBigValue: Buffer(2000000)
};
可以收集未被引用的o1
部分,还是作为整体收集的对象?看起来,使用o1
的第二个版本,o3
只是暂时保留o1.someKey
,o1.someBigValue
可以被释放。
另外,我确实意识到这可能因实现而异。如果是这样的话,那么最常思考这个问题的方法是什么?
答案 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
获取值根本不会建立任何类型的引用关系。