私のアプリケーションではまだメモリリークが発生していませんが、今後起こりうる問題について心配しています。Javascriptのイベントハンドラ、クロージャ、およびガベージコレクション
SomeClass.prototype.someMethod= function() {
var that= this
this.$div2.click(function() {
that.someMethod2();
});
}
そして、この$のDIV2が別のdivこの$のDIV1に追加されていることを言うことができます:。。私はこのような何かをやっている場合知っていただきたいと思います。私は
this.$div1.remove();
が呼び出して、後で私の工assのインスタンスの参照を失った場合には、ゴミ工assインスタンス集めますでしょうか。そしてHTML要素はどうですか?$ div2? $ div2はこれに追加されているのでDOM内にはありません。
この$ div2のイベントハンドラはHTML要素this $ div2への参照を保持し、変数「that」のために閉包を介してSomeClassのインスタンスへの参照を保持する可能性があるため、これを尋ねます。
このように、すべてのイベントとHTML要素を適切に削除する必要がありますか?または、単に "root"要素(これは$ div1)を削除するだけで問題を解決できますか?
私はそれがそうだと思います。ガベージコレクタは参照を追跡する必要があります。したがって、最後の参照がなくなった瞬間に理論上ガベージコレクションの候補になるはずです。私は、JSエンジンのものが到達不能なコードを分析して、まだ参照を持っているが参照が未使用の項目をマークできるのだろうかと思います... – RonaldBarzell
これは依存しています。古典的なWebアプリケーションでは、これは本当に問題ではありません。なぜなら、あなたは頻繁に別のビューを読み込んだり、更新したりするサーバに提出するからです。新しく登場するシングルページアプリでは、特にIEなどの「死んだ」ブラウザでは問題になる可能性があります。 – asgoth
@asgoth私は1ページのアプリケーションを作っています。 1つは、ページをリフレッシュせずに少なくとも12時間確実に実行する必要があるため、ガベージコレクションに関する私の心配です。 – Hoffmann