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

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

假设我有一个对象:

var o1 = {
    someKey: 'value'
};

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

var o2 = {
    o1Ref: o1
};

还有引用第一个对象属性的第三个对象:

var o3 = {
    o1propRef: o1.someKey
};

然后,假设 o2 被垃圾回收了。 o3 上对 o1.someKey 的引用是否会阻止收集 o1

然后,同样,假设 o1 更大,说:

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

是否可以收集未被引用的 o1 部分,或者将对象作为一个整体收集?看起来,对于 o1 的第二个版本,o3 只是坚持 o1.someKeyo1.someBigValue可以被释放。

此外,我确实意识到这可能因实现而异。如果是这样,一般来说,最好的思考方式是什么?

最佳答案

Does the reference to o1.someKey on o3 prevent o1 from being collected?

没有,因为没有(引用)。截至您创建对象时,您拥有o1.someKey副本,而不是对o1 的引用。 someKey 属性。 (JavaScript 没有引用任何东西,只有对象;所以没有属性引用,只有对象引用。)

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

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(或对它有引用的东西)。仅仅从 o1.someKey 获取一个值根本不会建立任何类型的引用关系。

关于javascript - 持有对对象属性的引用是否会阻止对象被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21861563/

相关文章:

javascript - 尝试从 iframe 内部调用 js 函数到其父级的跨域问题

php - jQuery 根据表行传递输入值

c++ - HeapCreate,Linux 中的 HeapAlloc,Linux 的私有(private)分配器

c++ - 切换到另一个不同的自定义分配器->传播到成员字段

c# - Int/Int64 .Net 内存分配

javascript - WIQL 的 VSTS 查询不返回请求的字段

javascript - 输入类型复选框为 true 或 false 取决于数据

linux - Linux 中应用程序可用的内存总量

c++ - 'new' 关键字在 C++ 中有什么作用?

c++ - 图数据结构的良好内存管理策略