2012-08-14 36 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


在一個側面說明,如果你將有一大堆的對象,你說刪除它,這是非常糟糕的主意,有每個對象的畫布。你應該考慮每個視覺層都有畫布。