4

クラスをそのように定義する場合:

var namespace = {};
namespace.appleClass = function() {
   this.collection = [];
};

namespace.appleClass.prototype.methodOne = function(arg) {
   this.collection.push(arg);
};

this.collection を取り除く方法は簡単です。

this.collection.length = 0;

私の質問は、上で定義されたメソッド ( on ) に何が起こるかnamespace.appleClass.prototypeです。JavaScript はそれらをどのように処理しますか? 関数はどこに「保存」されますか? そのストレージをどのように解放できますか?

上記のクラスはそのまま使用できます。

var apple = new appleClass();
appleClass.methodOne(2);
appleClass.collection[0]// will be equal to two etc..

DOM 参照、COM 参照、および削除演算子の背後にある長い話を null にする方法を知っています。私が知らないのは、「カスタムプロトタイプ」または「クラス」から関数とそれらへの参照を削除する最良の方法は何かということです。

4

2 に答える 2

2

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 つの関数が多くのメモリを占有することはありません。

于 2012-12-02T10:15:31.037 に答える
0

変数を に設定するnullと、DOM 要素と Javascript スコープの間で行われる循環参照を含め、すべてのブラウザーでオブジェクトへの参照が確実に解除されます。コマンドを使用しdeleteて、ガベージ コレクションの次の実行時にオブジェクトをクリアするようにマークしていますが、同じオブジェクトを参照する複数の変数がある場合、単一の変数を削除してもオブジェクトは解放されず、その変数との間のリンクが削除されるだけです。オブジェクト。ガベージ コレクションの次の実行では、変数のみが消去されます。

于 2014-09-18T10:33:04.647 に答える