8

mdnのドキュメントによると、このメソッドremoveChildはDOMからノードを削除しますが、それでもメモリ内に存在します。私の問題は、それをメモリからも削除したいということです。オペレーターで試しましたdeleteが、オブジェクトはまだそこにあります...

myCanvas.parentElement.removeChild(myCanvas);  // myCanvas actually removed from DOM
delete myCanvas;  // false. does nothing
alert(myCanvas); // shows HTMLCanvasElement instead of undefined
4

4 に答える 4

10

http://perfectionkills.com/understanding-delete/をお読みください。削除演算子は変数用ではありません(そのため、を返しますfalse)。

DOMノードへの変数の参照を削除する場合は、次を使用します。

myCanvas = null;

値を上書きします。JSのガベージコレクターがすべての作業を行うため、通常はこれを行う必要はありません。

于 2012-08-01T12:21:09.730 に答える
3

myCanvas変数に別の値(など)を割り当てるだけnullで、canvas要素を参照する変数がなくなります。残りはガベージコレクションが行います。

もちろん、保証はありません。これは、要素を参照する他の変数も存在しないことを前提としています。それ以外の場合、そのキャンバス要素を参照している他の変数やオブジェクトなどがある場合、それはメモリからまったく削除されません。要素への参照を含むが逆参照する方法がないクロージャがある場合、これを削除するのは難しくなります。

于 2012-08-01T12:16:49.370 に答える
0

これらの変数は自動的に作成され、オペレーターが手間をかけずに破棄できるため、キーワードmyCanvasなしで変数を初期化すると、コードスニペットが機能する可能性があります。varconfigurable: truedelete

またはgetElementsByClassName()、個人HTMLElement 自体ではなく、メソッドからオブジェクト参照を操作することもできます。

-ここでmyCanvasは、getElementById()操作などの結果だと思います-

によってHTMLCollection生成されたものgetElementsByClassName() は、ツリーから削除されるとすぐに、それ自体を更新し、問題のDOMオブジェクトへの参照を削除するためです。

言い換えれば、それは本質的に生きているので、参照を破棄/パージするための手動操作は必要ありません。

于 2014-12-25T16:40:30.277 に答える
0

基本的な答えは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;
于 2019-04-16T23:46:43.613 に答える