【问题标题】:"undefined" or "null" which the Garbage Collector is in favor of垃圾收集器支持的“未定义”或“空”
【发布时间】:2018-08-17 02:59:26
【问题描述】:

假设我创建了两个对象:

var a = new SomeObject();
var b = document.getElementById("someElement");
/* Do something with those two object */

在对这两个对象执行某些操作后,我需要清除它们以防内存泄漏。

问题是我应该在垃圾收集器更喜欢的“null”和“undefined”之间选择哪一个。

// 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;
*/

任何 cmets 将不胜感激!

【问题讨论】:

  • 仅供参考,在答案中添加了另一段,解释何时可能需要这样做。例如,我知道您的示例代码只是组成代码,但在这些示例中,ab 一旦在返回中定义它们的函数就会超出范围。此时,ab 引用的任何内容都将无法通过 ab 访问。如果你,例如使用使用ab(在ab 关闭)的匿名函数运行setTimeout,然后无论指向什么都将保留在内存中,直到该回调不再可运行。希望你能看到模式:)

标签: javascript memory-leaks


【解决方案1】:

垃圾收集器的工作原理是跟踪您的代码可以访问哪些对象。这个想法是,如果一个对象不可访问,它占用的内存块可以被释放而不会破坏你的程序。

可以访问对象的一种方法是将其分配给变量。为当前指向一个对象的变量分配一个新值(例如,通过将null 分配给a)将对该对象的引用计数减少一个。当这个或任何对象的引用计数减少到零时,它将有资格进行垃圾回收。

话虽如此,用什么值来替换变量的值并不重要,只要它不是其他会被垃圾回收的对象。因此,undefinednull 都可以使用。

请注意,如果在声明该变量的函数返回后,您的代码仍然可以访问某个变量,那么您只需要像这样清理变量。如果匿名函数在变量上关闭,如果变量是“全局的”(附加到 global 对象上或在没有 var 关键字的情况下声明),或者如果变量实际上是仍然存在的对象上的字段,则可能会发生这种情况可达。

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 2015-11-26
    • 2011-11-07
    • 2013-04-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多