this.collection を取り除く方法は簡単です。
this.collection.length = 0;
それは配列を取り除くのではなく、配列を切り捨ててエントリを持たないようにするだけです。実際に配列を完全に取り除くには、delete this.collection
(配列を参照しているプロパティを完全に削除し、配列をガベージ コレクションの対象にする) またはthis.collection = null
(配列への参照を解放し、ガベージ コレクションの対象にするが、そうしない) を実行します。プロパティを削除します。これは、値とともにまだ存在しますnull
)。
存在しthis.collection
、他の場所で参照されていないものはすべて、ガベージ コレクションの対象になります。これがいつ発生するか (または発生するかどうか) は、完全に JavaScript の実装に依存します。
これが重要なポイントです。JavaScript でメモリを「管理」するには、不要なものを参照していないことを確認するだけです。通常、それはアプリケーションロジックから外れます(もう必要ないので、それへの参照を削除します)。クロージャーがどのように機能するかを念頭に置いてコードを設計する場合、ほとんどの場合、メモリ管理について心配する必要はありません。
質問のコメントで質問を再確認してください。
の下にあるメソッドについて取り上げていますnamespace.appleClass.prototype
。JavaScript はそれらをどのように処理しますか? 関数はどこに「保存」されますか? そのストレージを解放するにはどうすればよいですか?
関数オブジェクトはヒープに格納されます (ほとんどの場合、ローカル変数によってのみ参照される場合、Google の V8 などの一部のエンジンはスタックを使用する可能性があります)。コードの場所は実装に依存します。関数オブジェクト (およびそのコード) への参照は、prototype
オブジェクトのプロパティに格納されますappleClass
。これらの関数は 1 つだけでnew namespace.appleClass
、プロトタイプ チェーンを介して作成されたすべてのインスタンスで共有されます。インスタンスごとに個別の関数のコピーはありません(関数への個別の参照のみ)。そのため、インスタンスでその関数を「クリーンアップ」することを心配する必要はありません。
その関数がコードのどこかでまったく必要なくなった場合 (たとえば、すべての appleClass
インスタンスが不要になった場合)、 を介して削除できますdelete namespace.appleClass.prototype.methodOne
)。これにより、プロトタイプからプロパティが削除され、関数オブジェクトへの参照が解放され、関数コードへの参照が解放され、これらすべてがガベージ コレクションの対象になります。しかし、これは非常に珍しいことであり、どのような場合でも、1 つの関数が多くのメモリを占有することはありません。