1

私は JavaScript の専門家ではないので、私の質問はばかげているように思えるかもしれません。次の HTML ブロックがあるとします。

<div>
     <script type="text/javascript">
         var variable_2  = new SomeObject();
     </script>
</div>

これにより、SomeObject インスタンスのヒープにメモリが明確に割り当てられ、variable_2 はグローバル コンテキストに存在します。

私の質問は次のとおりです。AJAX を使用して以前の HTML ブロックを再度生成した場合、variable_2 はグローバル コンテキストで SomeObject の新しく割り当てられたインスタンスを参照しますよね? しかし、その後、以前に割り当てられたインスタンスはどうなりますか? ガベージ コレクションですか、それともメモリ リークですか?

さらに、JavaScript メモリ管理のベスト プラクティスを説明している書籍や記事への参照を含めることができる場合は?

4

2 に答える 2

0

オブジェクトが到達不能になると、ガベージ コレクションが実行されます。以前のバージョンの Internet Explorer (バージョン 6 および 7) には、相互に参照しているが到達不能になったオブジェクトがガベージ コレクションされず、メモリ リークが発生するという問題がありました。ただし、これはあなたの例には関係ありません。あなたの例では、最初のオブジェクトへの参照がなくなると(つまり、変数を再割り当てすると)、オブジェクトは到達不能になり、ガベージコレクションされます。

JavaScript メモリ管理については、https://developer.mozilla.org/en-US/docs/JavaScript/Memory_Managementで読むことができます。

于 2013-04-08T08:24:14.150 に答える
0

JS ガベージ コレクターの詳細については、この投稿またはこの投稿をご覧ください。ただし、正確な動作はおそらく JS エンジン間で微妙に異なることに注意してください。たとえば、質問を投稿したい場合があります。詳細な技術的な説明については、V8 フォーラムをご覧ください。

私の意見では、あなたが説明することは悪い習慣であるため、絶対に避けたいと思います。実際には、まともなJSエンジンでメモリリークが発生した場合は驚くでしょう(.

于 2013-04-08T08:03:04.457 に答える