2009-05-15 7 views
4

割り当てられたメモリを自分で解放するか、ガベージコレクタの種類がありますか?Javascriptオブジェクトで使用されているメモリの割り当て解除

JavaScriptで次のコードを使用しても問題ありませんか?

function fillArray() 
{ 
    var c = new Array; 
    c.push(3); 
    c.push(2); 
    return c; 
} 

var arr = fillArray(); 
var d = arr.pop() 

おかげApple JavaScript Coding Guidelinesより引用

+0

この例では何をしますか? – Gumbo

答えて

8

使用して文を削除します。 新しい ステートメントを使用してオブジェクトを作成するときは、それを削除 ステートメントとペアにします。これにより、オブジェクトに関連付けられたメモリ と、プロパティ名を含む のすべてがガベージコレクションに使用できる であることが保証されます。 DELETEステートメントは、より で議論された「解放オブジェクト。」

これはあなたがそれを使用して終了したら、あなたのArrayに割り当てられたメモリを解放するためにガベージコレクタを許可するようにdeleteコマンドを使用することを示唆しています。 deleteステートメントが参照を削除するだけの点は、C/C++のガベージコレクションがなく、メモリがただちに解放されるという点では異なります。

+3

"delete"演算子はオブジェクトを実際に '削除'するわけではなく、JavaScriptのガベージコレクタがオブジェクトがもう使用されていないことを簡単に確認できるように、オブジェクトへの参照を削除するだけです。詳細については、次の質問を参照してください。http://stackoverflow.com/questions/742623/deleting-objects-in-javascript –

+0

@Steve:良い点 - 投稿を編集します。 – Noldorin

+0

'delete'演算子はオブジェクトからプロパティを削除するので、変数に対しては機能しません。 https://developer.mozilla。org/ja-ja/docs/Web/JavaScript/Reference/Operators/delete – AlexJM

3

変数arrおよびdは、グローバル変数として存在し、ガベージコレクタによって収集されるまで存在します。

変数はあなたの特定のケースでは

をブラウザ環境でwindowすなわちグローバルオブジェクトのプロパティとして設定されますが、それらはvarで宣言されているので、they will not be deletable from the global object.、最善の行動はnullを割り当てるかもしれませんあなたがそれらを終えた後の変数。また、スコープを関数に含めることを検討し、その関数内でスコープを使用して行う必要がある操作を行うこともできます。

+0

これは間違っています。変数 'arr'と' d'はオブジェクトのプロパティではなく、変数であるため、 'delete'キーワードを使って '削除'することはできません。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete – AlexJM

+0

私はそれらを別のものに割り当てることをお勧めします。 'arr = null; d = null; ' – AlexJM

+0

@AlexJMおそらく、このトラップに落ちたでしょう - http://perfectionkills.com/understanding-delete/#firebug_confusion。答えを更新して、指摘してくれてありがとう! –

2

JavaScriptのメモリ管理は自動であり、ガベージコレクタ(GC)があります。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

明示的に変数darrを削除することはできませんが、GCがメモリから削除できるようにするために、このようnullとして、他の何かに変数を設定することによって、その値への参照を削除することができます。

arr = null; 
d = null; 

キーワードdeleteは、オブジェクトのプロパティのみを削除することに注意してください。

関連する問題