【问题标题】:How does the browser's javascript garbage collection work?浏览器的 javascript 垃圾收集是如何工作的?
【发布时间】:2011-12-14 01:16:10
【问题描述】:

我必须自己销毁实例吗? ...如果我不给它们分配变量...它们会自动消失吗?

new ImageUploadView();

var Iu = ImageUploadView();

【问题讨论】:

  • 是的,它们是垃圾收集的。只要存在至少一个对它们的引用,对象就存在。

标签: javascript html browser garbage-collection


【解决方案1】:

如果 javascript 中没有对对象的引用,垃圾收集器会清理它。

垃圾收集器的工作方式是寻找没有人引用的 javascript 对象。如果没有人引用它,则不能再次使用它,因此可以将其删除并回收它所占用的内存。另一方面,如果任何 javascript 实体仍然具有对该对象的引用,则它仍然“正在使用”并且不能被删除。

在您的第一个代码示例中:

new ImageUploadView();

除非对象的构造函数将 this 指针存储到其他变量或对象中,或者创建一些导致对该对象的引用被持有的闭包,否则将不会引用这个新对象,它将是由垃圾收集器清理。

如果你第二个代码示例:

var Iu = ImageUploadView();

只要Iu 变量存在并保持在范围内,它将包含ImageUploadView() 函数返回的任何内容。请注意,第二个示例只是执行一个函数并存储它的值。它不一定创造任何东西。如果ImageUploadView() 只返回true,那么这就是Iu 变量将包含的所有内容。

【讨论】:

  • 所以,只要变量存在,它就会包含它所包含的值。知道了。 :P
  • @ŠimeVidas - 我添加了“保持在范围内”以更好地传达我想说的内容。
  • @jfriend - 不是这样。在您的 JavaScript 控制台中执行此操作:function Obj () { return true; }; var o = new Obj(); o == true;。我的控制台显示为假。 new SomeFunction() 返回 Object,而不是 SomeFunction() 的返回值。
  • @gilly3 - 他的第二个代码示例中没有new。这只是一个函数调用。
  • @jfriend00 - 啊,我错过了。 :-)
【解决方案2】:

第一种方法很好。假设ImageUploadView 的实例在其自身之后进行了适当的清理,它将被垃圾收集器收集。

【讨论】:

  • 它的返回值会被垃圾回收,即......(不是构造函数本身)。
  • @ŠimeVidas - 确实。我添加了几句澄清的话。
  • @gilly3,我如何确保“ImageUplaodView”正在适当地清理自己?
  • @user847495 - 如果ImageUploadView 在其自身范围之外做任何事情,那么对它的引用可能会一直存在。例如,创建全局变量、向 DOM 或全局对象添加属性、绑定事件 - 特别是在使用闭包或以其他方式传递闭包时。
【解决方案3】:

对于大型对象,假设内置垃圾收集器的浏览器会在超出范围时进行清理,这不一定是一个好习惯。您最好使用“删除”自行清除。例如:

delete MyImageUploadView;

编辑:如果对象未被作为属性引用,则最好将其设置为 null。

【讨论】:

    猜你喜欢
    • 2017-11-16
    • 2015-02-07
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多