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 docu on this )。

したがって、メモリを解放するには、オブジェクトへのすべての参照を削除するだけでよくcanvas、ガベージ コレクタの次の実行時にメモリが再び解放されます。

これは、block.canvas = null;または(オブジェクト/プロパティのスコープに応じて)を使用して、あなたがしたように行うことができます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 の削除は行いません。DOM ツリーに関連付けられていない可能性があります<canvas>が、関連付けられている場合は、忘れずに削除してください。

deletePS:プロパティを削除するためのキーワードについて言及している回答がいくつかあることに気付きましたが、実際には必要ありません。 が に設定されcanvas直後に GC が期待どおりに機能しますblock.canvasnulldeletedelete

于 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 に答える