Actionscript (ECMAScript の方言として JS と多くの部分を共有する) でさまざまな自明でないアプリケーションを開発したことで、私は今ではイベント リスナーに特別な注意を払う (執着する) ことに慣れています。ある時点で、さまざまなアプリをプロファイリングし、関連する文献を読んだ後、Flash プレーヤーのガベージ コレクターは、イベント リスナーが存在する (つまり、追加されたが削除されていない) 場合、未使用のリソースを解放するのに苦労することが明らかになりました。
これにより、イベント リスナーとして機能するすべての型に対してデストラクタのようなメソッドを定義 (および体系的に呼び出す) という標準的な方法が確立されました。後者は、初期化時に追加されたすべてのリスナーを削除する責任がありました。副作用として、すべてのaddEventListener(someMethod)
呼び出しが 'symmetrical' によって一致する必要があるため、名前のない関数をイベント リスナーとして使用することを控える必要がありましたremoveEventListener(someMethod)
。もう 1 つの方法は、弱参照を使用することです。
さて、Javascript に移ります。名前のない関数 (およびクロージャー) が言語にとってどれほど不可欠であるか、イベント リスナーとして広く使用されていること、およびリスナー関連のクリーンアップ コードがインターネット上で一般的に不足していることから判断すると、前述の Actionscript のランタイムの欠点がブラウザーで共有されていないこと。
具体的には、プレーンな Javascript と DOM イベントの場合、ドキュメントの一部が破棄されると、リスナーがアタッチされているかどうかに関係なく、GC がすべての関連リソースを解放することを理解するようになりました (AS と DOM には当てはまらないこと)。その「ドキュメント」、表示リスト)。
主にDOMを扱うjQueryにも同じことが当てはまると思います(場合によっては、jQueryが内部で独自のクリーンアップを実行する可能性を考慮して)。
これは正しいです?
また、ドキュメントから発生するのではなく、Backbone の Event モジュールや Node.js などのライブラリを使用して定義およびトリガーされるカスタム イベント (およびそのリスナー) を処理するにはどうすればよいEventEmitter
でしょうか? 同様のクリーンアップ機能を「無料で」期待するべきですか、それともメモリリークを避けるために、追加されたイベントリスナーを (「死んだ」オブジェクトから) 削除するように注意する必要があるのは明らかに別のケースですか?
(これが一般的すぎると感じた場合は、さらなる議論の基礎として具体的な例を提供していただければ幸いです)