1. 小言
JavaScript 言語は、スクリプト言語の柔軟性に加えて、高級言語の多くの機能も備えています。通常、オブジェクトの作成には new を使用しますが、GC はオブジェクトが占有しているメモリ領域を再利用する役割を果たします。そのため、GC を理解することで JavaScript のガベージについての理解が深まります。収集メカニズム。
2. ローカル変数とグローバル変数を使用して GC を説明する GC はメモリを再利用する際、他のオブジェクト参照が存在しないことを確認した後、まずそのオブジェクトが他のオブジェクトによって参照されているかどうかを判断します。オブジェクトのメモリが解放されるため、オブジェクトが参照されなくなったことをどのように判断するかが GC の鍵となります。 🎜> コードは次のとおりです:
<script> <a style="CURSOR: pointer" data="57752" class="copybut" id="copybut57752" onclick="doCopy('code57752')">function aa(){ <U>this.rr = "ポップアップ ウィンドウ" } ; function bb(){ </script>this.rr = "ポップアップ ウィンドウ" ";
}
var b1;
function cc(){
var a1 = new aa();
b1 = new bb();
return b1;
cc();
🎜>上記のコードでは、cc() の実行後に a1 が再利用されます。いくつかの基本的な本では、a1 がローカル変数、b1 がグローバル変数であると説明されています。ローカル変数は実行後に GC によってリサイクルされますが、常にそうとは限りません。次のコード:
コードをコピー
コードは次のとおりです。
<script> </script>
function aa(){
this .rr = "ポップアップ ウィンドウ";
function bb( ){
var b1 = cc();
< ;/script>
、 cc 関数の a1 と b1 はローカル変数ですが、それでもテキスト ウィンドウが表示されます。これは、b1 が GC によってリサイクルされていないことを意味します。したがって、JavaScript のローカル変数はすべて GC によってリサイクルされるわけではありません。
3. GC の抽象的な理解
GC リサイクルのメカニズムについては、さらに理解する必要があります。この時点で、二重リンク リスト、スコープ チェーン、アクティブ オブジェクトなどのいくつかの概念が導入されます (理解を容易にするために、原文の概念は簡略化されています [http://softbbs.pconline.com.cn/9497825.html]) ]) で、二重リンク リストについて説明します。 複合オブジェクトの上位と下位の階層関係は、関数 cc を例にとると、スコープ チェーンとアクティブ オブジェクトがそれぞれノードになります。 :
windowcca1b1rr
(詳細は原文で説明) cc( ) メソッドでは、メモリ内の変数の参照関係は上図のようになり、テキストの説明は次のとおりです:
window window がトップレベル オブジェクトであると仮定すると、cc のアクティブ オブジェクトには cc が含まれます (操作中にリサイクルされません)
cc のアクティブ オブジェクトには a1 と b1 が含まれ、そのスコープ チェーンは window
a1 のアクティブ オブジェクトには rr が含まれ、その役割 ドメイン チェーンは cc
のアクティブ オブジェクトb1 には rr が含まれており、そのスコープ チェーンは cc です。
cc() が実行されると、cc の実行環境によってアクティブ オブジェクトが作成され、そのローカル変数 a1、b1 が cc のアクティブ オブジェクト内にハングされます。 cc() が実行されると、実行環境はアクティブなオブジェクトによって占有されているメモリを再利用しようとしますが、ローカル変数 b1 は b1 を返すため、それにスコープ チェーンが追加されます: windowしたがって、ローカル変数/関数をグローバルにプロモートしたい場合は、それにスコープ チェーンを追加するだけです。
同時に、オブジェクトのスコープ チェーンを制御することも重要です。スコープ チェーンにより、GC がターゲット オブジェクトをリサイクルできなくなります。例:
。
コードをコピーします コードは次のとおりです: