DOM オブジェクトに関しては、循環参照に注意してください:
JavaScript におけるメモリ リーク パターン
メモリはオブジェクトへのアクティブな参照がない場合にのみ再利用できることに注意してください。一部の JS エンジンは内部関数で実際に参照される変数をチェックせず、外側の関数のすべてのローカル変数を保持するだけなので、これはクロージャやイベント ハンドラーによくある落とし穴です。
これは簡単な例です:
イベント ハンドラーが存在する場合、単純な JS 実装は bigString を収集できません。この問題を解決するには、init() の最後に bigString = null を設定するなど、いくつかの方法があります (delete はローカル変数と関数に対しては機能しません)パラメータ: delete は、変数オブジェクトにアクセスできないときにオブジェクトからプロパティを削除します。厳密モードの ES5 は、ローカル変数を削除しようとすると ReferenceError をスローします!)。
bigString
init()
bigString = null
delete
ReferenceError
メモリ消費を気にする場合は、不必要なクロージャを避けることをお勧めします。
Eric Lippert は、少し前に 詳細なブログ投稿 を書き、このトピックについて (さらに VBScript との比較も) 説明しました。より正確には、彼は JScript について書きました。これは、JavaScript に非常に似ていますが、Microsoft 独自の ECMAScript 実装です。 Internet Explorer の JavaScript エンジンでも動作のほとんどが同じであると考えてよいでしょう。もちろん、具体的な実装はブラウザごとに異なりますが、いくつかの共通原則を他のブラウザにも適用できると思います。
このページから引用:
ガベージ コレクションの主な目的は、プログラマが作成および使用するオブジェクトのメモリ管理について心配する必要がないようにすることです。もちろん、それが避けられない場合もあります。少なくともガベージ コレクションの仕組みについて一般的に理解しておくことは常に有益です。コレクション作品。
歴史的メモ: 以前のバージョンの回答には、delete 演算子への誤った参照がありました。 JavaScript では、delete 演算子はオブジェクトからプロパティ を削除します。これは、C/C の delete とはまったく異なります。
DOM オブジェクトに関しては、循環参照に注意してください:
JavaScript におけるメモリ リーク パターン
メモリはオブジェクトへのアクティブな参照がない場合にのみ再利用できることに注意してください。一部の JS エンジンは内部関数で実際に参照される変数をチェックせず、外側の関数のすべてのローカル変数を保持するだけなので、これはクロージャやイベント ハンドラーによくある落とし穴です。
これは簡単な例です:
リーリーイベント ハンドラーが存在する場合、単純な JS 実装は
bigString
を収集できません。この問題を解決するには、init()
の最後にbigString = null
を設定するなど、いくつかの方法があります (delete
はローカル変数と関数に対しては機能しません)パラメータ:delete
は、変数オブジェクトにアクセスできないときにオブジェクトからプロパティを削除します。厳密モードの ES5 は、ローカル変数を削除しようとするとReferenceError
をスローします!)。メモリ消費を気にする場合は、不必要なクロージャを避けることをお勧めします。
Eric Lippert は、少し前に 詳細なブログ投稿 を書き、このトピックについて (さらに VBScript との比較も) 説明しました。より正確には、彼は JScript について書きました。これは、JavaScript に非常に似ていますが、Microsoft 独自の ECMAScript 実装です。 Internet Explorer の JavaScript エンジンでも動作のほとんどが同じであると考えてよいでしょう。もちろん、具体的な実装はブラウザごとに異なりますが、いくつかの共通原則を他のブラウザにも適用できると思います。
このページから引用:
ガベージ コレクションの主な目的は、プログラマが作成および使用するオブジェクトのメモリ管理について心配する必要がないようにすることです。もちろん、それが避けられない場合もあります。少なくともガベージ コレクションの仕組みについて一般的に理解しておくことは常に有益です。コレクション作品。
歴史的メモ: 以前のバージョンの回答には、
delete
演算子への誤った参照がありました。 JavaScript では、delete
演算子はオブジェクトからプロパティ を削除します。これは、C/C のdelete
とはまったく異なります。