说我有类似的东西:
function getMember() {
var myRoot = {
a: {val: 1},
b: {val: 2}
};
return myRoot.a;
}
var myMember = getMember();
javascript在超出范围后如何处理myRoot
对象?即使存在对myRoot.b
的实时引用,它(及其“剩余”成员myRoot.a
)是否会被垃圾收集?
答案 0 :(得分:0)
引用成员是否会阻止父对象上的GC?
没有
除非该成员有一个循环引用回到父对象,或者包含/是一个关闭它的函数,当然,但这不是这里的情况。
在超出范围后,V8如何处理myRoot对象?
它将被视为每个其他对象。 myRoot
变量将超出范围,对象将不再被任何内容引用,因此它有资格进行垃圾回收。
它甚至可能已存储在堆栈中,这意味着当函数返回时会立即重新声明其内存。
即使对myRoot.a的实时引用存在,它(及其“剩余”成员myRoot.b)是否会被垃圾收集?
是。引用不是“myRoot.a
”,而是堆上的对象{val: 1}
。它没有附上名字。