2016-07-26 7 views
1

あなたのような関数を定義した場合:Ajax(XMLHttpRequest)オブジェクトは使用後にクリーンアップされますか?

function fetchData(callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
     if(xhr.readystate === 4 && xhr.status === 200) { 
      callback(xhr.responseText); 
     } 
    }; 
    xhr.open('GET', 'http://example.com/', true); 
    xhr.send(); 
} 

fetchData機能をたくさん実行している私を想像してみてください。

コールバックの実行後にxhr = null;を実行する必要がありますか?

JavaScriptはgarbage collectorですが、xhrからnullに設定されていません。

この質問は、XMLHttpRequest - freeing after use?と似ていますが、実際にオブジェクトがガベージコレクションによって削除される状態になっていることを説明する回答は得られませんでした。

+1

これは実装仕様の詳細ですが、仕様がどうなるかはわかりません。 –

+0

どこにxhrをnullに設定しますか? readystateハンドラの中にnullを設定すると、内部に立っている間にbuildilngを爆破しようとするようなものになります。 –

+0

'callback'が実行されると、' xhr'への参照はなくなり、スコープ全体が収集されます。 – Brian

答えて

0

私は非常あなたがリンクされ、完全にmozilla documentationを読むことをお勧めします:

が が割り当てられたメモリを使用します(書き込み、読み出し)と それがあるときに割り当てられたメモリを解放し、あなたが必要とするメモリを割り当てもう必要ありません。 最初の部分と2番目の部分はすべての言語で明示的です。最後の部分は低レベル言語では明示的ですが、JavaScriptのような高水準言語ではほとんど暗黙的です。参照することにより

ガベージコレクション:

これは最も単純なガベージコレクションアルゴリズムです。このアルゴリズムは、「オブジェクトはもはや必要ではない」という定義を、「オブジェクトはそれを参照する他のオブジェクトを持たない」ことを減らす。このオブジェクトを指す参照がゼロの場合、オブジェクトはガーベッジ・コレクタブルと見なされます。サイクルに関してはlimitationがあります。

マークアンドスイープアルゴリズム:

このアルゴリズムは、「オブジェクトが到達不能である」と「オブジェクトがこれ以上必要とされていない」の定義を低減します。このアルゴリズムは、ルートと呼ばれるオブジェクトのセットの知識を前提としています(JavaScriptでは、ルートはグローバルオブジェクトです)。定期的にガベージコレクタはこれらのルートから開始し、これらのルートから参照されているすべてのオブジェクトを検索し、次にそれらから参照されるすべてのオブジェクトを検索します。ルートから開始して、ガベージコレクタはすべての到達可能なオブジェクトを見つけ、到達可能なオブジェクト。

結論:あなたのオブジェクトがどこからでも到達できない場合(あなたがその機能を終了した場合)、ガベージコレクションされます。これは高級言語で心配する必要があるものではありません。

編集:ガーベッジコレクタがXMLHttpRequest hereをどのように処理するかの仕様を読むことができることを指摘していただきありがとうございます。Roland Starke

0

いいえ、xhrをnullに設定する必要はありません。

JavaScriptでは、オブジェクトへの参照がすべて削除されるとJavaScriptが発生します。だから、限り、あなたのようなクレイジーな何かをしていないよう:コードの参照に続いて、後でその値を

fetchData.cache = xhr; 

を:

var data = fetchData.cache; 

は、その後、あなたはanythignあなたの自己をすることを心配する必要はありません。 GCはその時刻にそれを取得します。

+0

@RolandStarke確かに可能です。その変数への参照がfetchData関数で使用され、xhrオブジェクトがガベージコレクションされない限り、すべてが参照になります。とにかくポイントは、あなたが問題に遭遇する可能性があることを示すことでした。あなたが普通に何もしない限り、あなたは大丈夫でしょう。 –

+0

あなたは、*すべて*が参照プリミティブ型ではないということは正しいです。オブジェクトは参照されます。これをもっと明確にするために私の答えを更新しました。 [https://jsfiddle.net/22xcchge/7/](https://jsfiddle.net/22xcchge/7/) –

関連する問題