基本的な答えはundefined
、ガベージコレクターがその仕事を実行できるように、キャンバスを参照するすべての変数をに設定する必要があるということです。しかし、実際にはそれほど単純ではない場合もあります。
メモリリークを回避するために動的に作成されたHTMLキャンバス要素を完全に削除しようとしたときに遭遇したいくつかのトリッキーな状況を次に示します。
(1)私がcanvas要素に追加したメソッドは、それへの独自の参照を保持していました(サイクルを作成しました)。キャンバスを削除するときにすべてのカスタムプロパティを削除することで、これを修正しました。
function deleteAllProperties(obj) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
delete obj[key];
}
}
}
deleteAllProperties(myCanvas);
myCanvas = undefined;
(2)他のオブジェクトの内部変数はまだキャンバスを参照しています。それらすべてを次のように設定することで修正されましたundefined
:
_myVar = myBuilder = myObserver = undefined;
(3)キャンバスのコンテキストを参照する変数:var ctx = myCanvas.getContext('2d');
これは、一部のブラウザーで(設定後でもmyCanvas = undefined
)キャンバスに保持されます。その変数もクリアすることで修正されました:
ctx = undefined;