2011-02-04 7 views
0

私は多くの同様の質問を見たことがありますが、誰も私の問題に答えるようです。 jQuery/JavaScript:ガベージコレクタは私の変数をクリアしていますか?

var mainDataObject = null; // Global 

// Called when DOM is ready with $(function() { ... }) 
$.ajax({ 
    type: "GET", 
    dataType: "json", 
    url: '...', 
    success: function(json) { 
     mainDataObject = json; 
    } 
}); 

mainDataObject、またはその内容は、いくつかの時間後にクリアされますか?これはブラウザに依存しますか?あなたは、その変数がページの生涯にわたって続く必要があります。

私が見ている問題は、ランダムに、mainDataObjectが空になっているようです。私は、さまざまなブラウザやオペレーティングシステムを使用するランダムなユーザーに起こるため、問題を再現できません。

+0

ajaxコールの対象は何ですか? – Victor

答えて

3

mainDataObjectがどのコンテキストで作成されているかによって異なります。

関数(-context)の場合、関数が終了すると、変数はガベージコレクタからクリアされます。

グローバル(-context)内にある場合は、明示的にnullに設定するか、ページをアンロードするまでそのままです。

はもちろんの場合、あなたは、どこかに、何らかの形でそれにActivation object[[Scope]]だとメモリがクリアされていないようですmainDataObjectのコピーを作成し、コンテキスト上で閉じ機能をクロージャを作成します。

+0

はい、申し訳ありません、私は詳細を追加しました - mainDataObjectはグローバルです。 –

+0

mainDataObjectは、この例ではグローバルであると宣言されています($ .ajaxより上) – Distdev

+0

は真ではありません。関数内にクロージャがある場合、変数はクロージャ関数がどこかで参照されている限り長く留まります。 – BiAiB

0

任意のjavascript変数は、それを参照できる限り長く続きます。

変数がガベージコレクトされていない場合は、逆のことではありません。

関連する問題