2011-09-15 18 views
3

私はJohn Resig's recipeをJavaScript 'クラス'と継承に使用しています。私はこの質問のためにこのような何かに戻って自分のコードを剥奪しました:オブジェクト内からJavaScriptオブジェクトを明示的に解放するにはどうすればよいですか?

MyClass = Class.extend({ 

    // create an <h3>Hello world!</h3> in the HTML document 
    init : function (divId) { 
     this._divId = divId; 
     this._textDiv = document.createElement("h3"); 
     this._textDiv.innerHTML = "Hello world!"; 
     document.getElementById(divId).appendChild(this._textDiv); 
    }, 

    // remove the <h3> and delete this object 
    remove : function() { 
     var container = document.getElementById(this._divId); 
     container.parentNode.removeChild(container); 

     // can I put some code here to release this object? 
    } 

}); 

すべてがうまく機能:

var widget = new MyClass("theDivId"); 
... 
widget.remove(); 

私はページ上のこれらのものの数百を持っているつもりです(もちろん一部で感覚的な機能)と私は各オブジェクトのメモリを解放する簡単な方法をしたいと思います。 widget = null;を使用でき、必要なときにGCがオブジェクトを解放すると信じていますが、remove()メソッドで明示的に何かできますか?私はremove()の終わりにthis = null;を配置することは動作しないことを知っている;)

答えて

1

いいえガベージコレクタに直接アクセスする方法はありません。あなたが言うように、あなたができることは、オブジェクトがもはや参照されていないことを確認することです。

IMO、それはそうです。ガーベジコレクターは、長年にわたる研究がこの文書を書き込んでいて、あなたが最適化を試みても、それよりも優れた仕事をしていない可能性が高いので、あなた(そして私)よりはるかにスマートです。

もちろん、JSエンジンとのインターフェースをとっているなら、あなたはその位置にいることは間違いありませんが、実行を制御してガベージコレクションを強制することができます。あなたが興味を持っているなら、スパイダーモンキー(またはv8、あるいはあなたのファンシーをくすぐるエンジン)をダウンロードしてコンパイルしてください。そしてreplには、その両方のためにそのgc()があると思います。

標準ではガベージコレクションの内部を定義していないので、コードのある時点でgcを呼び出すと便利だと判断したとしても、ガベージコレクションの内部を定義するわけではないので、すべてのプラットフォームで同じメリットがあります。

2

は手動でオブジェクトを破壊するいかなる方法が存在しない、唯一の方法は、あなたのコード内で実際に をGCにあなたのオブジェクトと信頼除去へのすべてのリンクを解放することですあなたいくつかのブラウザではGCの問題となる可能性があるので、削除方法でもthis._textDiv = nullcontainer = nullをクリアする必要があります。

+0

JSオブジェクトを削除することはしばしばありませんが、DOM参照は不要になった時点で無効にすることをお勧めします。 (IE6ではこれが必須です)。 – c69

+0

OK。 nullへのDOM参照を設定するためにいくつかの行を追加しました。ヒントをありがとう:) – wpearse

1

は、値を割り当てられないキーワードです。スコープからオブジェクトを削除する唯一の方法は、すべての変数に手動でnullを割り当てることです。

ただし、XMLHttpRequestの一部の実装では、XMLHttpRequestオブジェクトがメモリから解放される前にonreadystateおよびopen関数をリセットする必要があります。

関連する問題