2011-10-26 10 views
3

クロージャーでラップされたいくつかのヴァースがガベージコレクションのためにリリースされるようにしています。私はそれらを未定義に設定しているかどうか確信していないか、削除するだけで十分です。何かご意見は?javascript:クロージャー内のオブジェクトがゴミ収集されていることを確認してください

// run once for each photo, could be hundreds 
$("img.photo").each(function(){ 
    // create the vars to put in the callback 
    var photo = $(this); 
    var tmp = new Image(); 

    // set the callback, wrapping the vars in its scope 
    tmp.onload = (function(p,t){ 
     return function(){ 
     // do some stuff 

     // mark the vars for garbage collection 
     t.onload = ? 
     t = ? 
     p = ? 
    })(photo, tmp) 

    // set the source, which calls onload when loaded 
    tmp.src = photo.attr("src") 
}) 

答えて

6

at this postガベージコレクションの詳細については、こちらをご覧ください。

.eachに匿名機能を送信しているため、その機能とそのすべてがガベージコレクションされます。一部を除き:

// set the callback, wrapping the vars in its scope 
tmp.onload = (function(p,t){ 
    return function(){ 
    // do some stuff 

    // mark the vars for garbage collection 
    t.onload = ? 
    t = ? 
    p = ? 
})(photo, tmp) 

機能(function(p,t){ ... })(photo, tmp)はそれが匿名であるため、収集され、もはや参照されます。しかし、それが返す関数は持続するtmp.onloadに追加されます。

設定されている変数を確実に確認したい場合は、変数を設定し終えたら、未定義またはnullに設定します。そうすれば、ガベージコレクタは範囲の参照がないことを確かめ、それによってそれらを解放することができます。

2

"onload"関数が終了すると、クロージャ自体を参照するものは何もないため、すべてが収集されます。

-3

JavaScriptは、varキーワードで宣言された変数に対してスコープが実行された変数を処理します。

オブジェクトを宣言した場合は、deleteキーワードを使用してメモリを解放してください。

x = new Object; 
alert(x.value); 
delete (x); 
alert(x); //this wouldn't show 

また、What is JavaScript garbage collection?で見つかるかもしれません。

+2

'delete'はメモリを解放しません。それは参照を削除するだけです(そうでなければ 'var x = {a:0}; var y = x; xを削除します; alert(y.a)')。そしてあなたは[変数を削除できません](https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator)。 – delnan

関連する問題