我有以下代码:
var o = (function() {
var o1 = {name: "o1"};
var o2 = {name: "o2"};
var o3 = {name: "o3"};
o1.child = o2;
o2.child = o3;
o3.parent = o2;
setTimeout(function() {
o1.child = null;
}, 1000);
return o1;
})();
对象o2
和o3
是否有资格在超时回调退出后进行垃圾回收?
答案 0 :(得分:4)
在代码中运行此代码时,局部变量将超出范围,并且在超时触发后,指向的对象将可用于垃圾回收并中断链接它们的链,因此仅保留o1
,分配给o
。
但是,如果您只是在全局范围内运行该函数的内容,例如:
var o1 = {name: "o1"};
var o2 = {name: "o2"};
var o3 = {name: "o3"};
o1.child = o2;
o2.child = o3;
setTimeout(function() {
o1.child = null;
}, 1000);
然后o1
,o2
和o3
都将成为全局对象的属性(浏览器中为window
),需要单独清除。