9

我想要一堆对象,比如说:

function Block() {
  this.canvas;
}

blocks = [];

我有时会指定:

block[x] = new Block();

进而:

block.canvas = document.createElement('canvas');

但有时我也想删除这个新画布以释放内存。我只需要这样做:

block.canvas = null; (or whatever the appropriate method is)

然后javascript会在某个阶段释放内存?或者有没有明确的方法来删除对象并释放内存?

谢谢!

4

4 回答 4

12

被无处引用的对象占用的内存在 JavaScript 中由垃圾回收MDN 文档 on this)回收。

因此,为了释放内存,您只需删除对canvas对象的所有引用,并且在垃圾收集器的下一次运行中,内存将再次被释放。

这可以像您一样使用block.canvas = null;or (取决于对象/属性范围) by 来完成delete block.canvas

但请确保您删除了所有引用。这也可以是 DOM 或任何其他对象的引用!

于 2012-08-14T09:45:22.287 回答
4

如果您实际使用该画布来绘制对象,这还不够。如果要将画布添加到 DOM,则还需要将其从中删除,否则它当然会保留在内存中。如果您使用 添加它appendChild,则应使用删除它removeChild


附带说明一下,如果您要像您所说的那样拥有一堆对象,那么每个对象都有画布真是个坏主意。您应该考虑为每个可视层设置画布。

于 2012-08-14T09:48:12.173 回答
2

大多数 javascript 引擎使用引用计数标记和交换作为其 GC 策略,因此任何没有引用全局对象(浏览器环境中的窗口)的对象都会在某个阶段被释放。

因此,为了确保您的<canvas>元素可以被收集,您应该确保:

  • 没有变量或属性引用这个,通过运行block.canvas = null你可以完成任务
  • <canvas>元素不再附加到 DOM 树,通过运行你canvas.parentNode.removeChild(canvas)可以完成

从您提供的代码中,您没有执行DOM 删除,也许您<canvas>没有附加到 DOM 树,但如果是,请记住将其删除。

PS:我注意到一些答案提到了delete删除canvas属性的关键字,但这确实不是必需的,GC在block.canvas设置为之后按预期工作null,因为adelete可能导致V8运行更慢,我的建议是防止使用delete.

于 2012-08-14T09:47:22.687 回答
1

Javascript 有一个名为 delete 的运算符:

delete block.canvas;

示例:http ://www.openjs.com/articles/delete.php

于 2012-08-14T09:45:40.983 回答