2012-08-14 72 views
5

我想有一大堆的对象,让我们说:如何删除JavaScript的画布

function Block() { 
    this.canvas; 
} 

blocks = []; 

和我将在场合注明:

block[x] = new Block(); 

然后:

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

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

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

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

谢谢!

+0

感谢您的答案家伙,都非常有用。显然我不能upvote,但! – saward 2012-08-14 10:53:03

回答

7

由对象拍摄的无处引用的内存在JavaScript中被垃圾回收MDN docu on this)恢复。

所以为了释放内存,你只需要删除对你的canvas对象的所有引用,并在垃圾回收器的下一次运行中,内存将被再次释放。

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

不过可以肯定的,那您删除参考。这也可以是DOM或任何其他对象的引用!

1

JavaScript有一个名为删除操作:

delete block.canvas; 

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

+0

改为使用'block.canvas = null'。 'delete'在运行时修改'block'的结构,这是一个反作用/昂贵的操作。 请参阅https://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/#de-referencing-misconceptions – mems 2016-06-13 09:27:29

0

JavaScript引擎使用引用计数标记和交换为GC的政策,所以与任何对象最没有引用全局对象(浏览器环境中的窗口)将在某个阶段被释放。

所以要保证你的<canvas>元素可以被收集起来,你应该确保:

  • 没有变量或属性引用此,通过运行block.canvas = null你做事情
  • <canvas>元素不再连接到DOM树,通过运行canvas.parentNode.removeChild(canvas)你可以把它做

从你提供的代码,你不这样做的DOM去除,也许你<canvas>没有连接到DOM树,但如果是这样,记得删除它。

PS:我注意到一些答案求佛的delete关键字删除canvas属性,但它是真的不neccessary,GC按预期工作block.canvas设置为null刚过,因为a delete may cause V8 to run more slowly,我的建议是防止使用delete

3

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


在一个侧面说明,如果你将有一大堆的对象,你说删除它,这是非常糟糕的主意,有每个对象的画布。你应该考虑每个视觉层都有画布。