JavaScriptでガベージコレクションはどのように機能しますか? .NETガベージコレクションに似ていますか?そして、VBScriptでのガベージコレクションの実装が悪いため、人々はそれを避け、標準のクライアント側言語としてJavaScriptの設定を確立しましたか?
ガベージコレクションはどのように機能しますか?
簡単な答えは次のとおりです。メモリのブロック(たとえば、オブジェクト)に到達できなくなった場合、それは再利用される資格があります。いつ、どのように、またはそれが再利用されるかどうかは完全に実装次第であり、実装が異なればそれも異なります。しかし、言語レベルでは、それは自動的です。
例えば:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
}
foo
が戻ると、オブジェクトbar
が指すオブジェクトは、それを参照するものが残っていないため、自動的にガベージコレクションに使用できます。
対比:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
return bar;
}
// elsewhere
var b = foo();
...これで、オブジェクトへの参照は呼び出し後も存続し、呼び出し元がb
またはb
に何か他のものを割り当てるまで、またはスコープ外になるまで存続します。
また、対照的:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
setTimeout(function() {
alert("Three seconds have passed");
}, 3000);
}
ここでは、foo
が戻った後でも、タイマーメカニズムにはタイマーコールバックへの参照があり、タイマーコールバック(closure)にはコンテキストへの参照があります。作成され、bar
変数が含まれています。その結果、理論的には、bar
が返すものは、foo
が戻った直後にガベージコレクションに使用できません。代わりに、タイマーが起動してコールバックへの参照を解放し、コールバックとそれが参照するコンテキストをGCの対象にするまで保持されます。 (実際には、最新のJavaScriptエンジンは、可能な場合にクロージャを最適化できます。たとえば、上記の静的分析では、コールバックがbar
を参照せず、eval
またはnew Function
コードは、実行時に動的に参照する可能性があるため、JavaScriptエンジンは、関数が参照するコンテキストからbar
を安全に除外できるため、参照内容をGCに適格にすることができます。 )。 ( この記事 の閉鎖についての詳細。)
JavaScriptは、循環参照のクリーンアップの処理に問題はありません。たとえば、次のようになります。
function foo() {
var a, b;
a = {};
b = {};
b.refa = a;
a.refb = b;
}
foo
が戻ったとき、a
がb
を参照しているという事実とその逆は問題ではありません。他にどちらも参照していないので、両方をクリーンアップできます。 IEでは、オブジェクトの1つがホスト提供のオブジェクト(DOM要素やnew ActiveXObject
を介して作成されたものなど)である場合、これはnottrueです。 JavaScriptオブジェクト。 (たとえば、JavaScriptオブジェクト参照をDOM要素に配置し、JavaScriptオブジェクトがDOM要素を参照している場合、どちらも参照していない場合でも、相互にメモリに保持されます。)しかし、それはIE バグissue、JavaScriptのものではありません。
再:
人々が標準のクライアントサイドAPIとしてjavascriptに戻ったのは、vbscript GCが悪いからですか?
JavaScriptは元のクライアント側のWebスクリプト言語でした。 VBScriptは、Microsoftがブラウザを発表した後、Microsoftブラウザでのみサポートされていました。 JavaScriptは、最も幅広いブラウザで作業したい場合、町で唯一のクライアント側スクリプトゲームです。 <subjective>これは、従来のVBScriptの言語の約8倍でもあります。 ;-) </主観>
ガベージコレクション 原則として、すべての言語で同様の方法を使用します。ただし、それらの実装は環境によって異なります(たとえば、ブラウザーごとにJavaScript GCの実装方法が異なります)。 ChromeのGCの非常に簡単な概要については、たとえば、 this 。
VBScriptに関しては、IEでのみ実行されるJavaScriptのライバル/置換言語として作成されました。これは、VBSが導入された時点ではかなり合理的な決定でした-IEはブラウザシェアの90%以上を占めており、VBSは(広くサポートされ、古く、機能が乏しい時間)JavaScript;最近はそれほど多くありません。また、VBScriptは基本的にVisual Basic Liteであり、そのブランドに関連するすべての否定的な意味があります。