私はJSのメモリ管理についてもっと知りたいと思っています。私はクロージャについていくつかの質問があります。Javascript:名前付きクロージャとメモリ管理
ケース:
// Suppose that object var is capable to emit events
var object = new EventEmitter();
object.addEventListener('custom-event', function callback(event) {
object.removeEventListener('custom-event', callback);
object = null;
//Do some heavy computation like opening a specific view or somehthing similar
var heavy_window = new HeavyWindow();
heavy_window.open();
});
ケース:
// Suppose that object var is capable to emit events
var object = new EventEmitter();
object.addEventListener('custom-event', callback = function(event) {
object.removeEventListener('custom-event', callback);
object = null;
//Do some heavy computation like opening a specific view or somehthing similar
});
私の質問
は、次のとおりです。ケース1:
object
は、heavy_window
が無効になるまでメモリに残りますと考えるのは正しいですか?- クロージャ内で
object
varをヌルするとgcに役立つことがありますか?
ケース2:メモリリークが発生する可能性があります
...addEventListener(callback = function() {})
代わり...addEventListener(function callback() {})
のこのような方法で閉鎖を命名- ?
callback = function() {}
を宣言すると、グローバルな隠れ変数が発生しますか?
- ?
注、私はjQueryのでは例が必要か、他のフレームワークを使用しないでください。私はJavaScriptのバニラでもっと知りたいと思っています。
ありがとうございます。
ケース1について、「オブジェクト」は「heavy_window」とは何が関係していると思いますか? – Bergi
@Bergi 'heavy_window'は' object'に付けられたリスナの内部に作られています。 'heavy_window'が存在するまで、' object'はメモリに残ります。私は正しい? – Andrea
いいえ、リスナー関数が 'object'に付加されている可能性がありますが、呼び出し中に作成されたものはそうではありません。関数が返ってくると範囲外になり、何も参照を保持しません。あなたがどこかに明示的にそれらを格納していないか、関数から関数を返すことができないので、呼び出し元が何かを行う可能性があります。 – Bergi