假设我创建了两个对象:
var a = new SomeObject();
var b = document.getElementById("someElement");
/* Do something with those two object */
在处理完这两个对象之后,我需要清除它们,以防发生内存泄漏。
问题是我应该选择垃圾收集器将在“空”和“未定义”之间选择哪一个。
// firstly, remove DOM node
b.parentElement.remove(b);
// then clear the variants using "null" or "undefined"
a = null;
b = null;
/* or:
a = undefined;
b = undefined;
*/
任何评论将不胜感激!
答案 0 :(得分:2)
垃圾收集器通过跟踪代码可以访问哪些对象来工作。这样的想法是,如果无法访问对象,则可以释放该对象占用的内存块,而不会破坏程序。
访问对象的一种方法是将其分配给变量。将新值分配给当前指向对象的变量(例如,通过将null
分配给a
)将使该对象的引用计数减少一。当此对象或任何对象的引用计数减少为零时,它将有资格进行垃圾回收。
所有这一切,用什么值代替变量的值并不重要,只要不是要被垃圾回收的其他对象即可。因此,undefined
和null
都可以使用。
请注意,如果变量在声明了变量的函数返回后仍可被代码访问,则仅需要清理此类变量。如果匿名函数在变量上关闭,变量是“全局”变量(附加到global
对象上或声明为不带有var
关键字),或者变量实际上是变量上的字段,则可能会发生这种情况一个仍然可以到达的物体。