値の種類、実行環境とゴミの回収
4100 ワード
ECMAscriptにおける変数は、緩いタイプであり、すなわち、異なる時期に異なるタイプの値を持つことができます.これはECMAScriptの最も強力な特性の一つです.
基本タイプと参照タイプの値
javascriptの値の種類は2つあります.
基本タイプの値と参照タイプの値の違い
保存方法が違います
基本型の値の変数は確かな値を保存します.参照型の値の変数はポインタで、このポインタはメモリのオブジェクトを指します.
参照タイプの値は、属性と方法を動的に追加することができます.
コピー形式が違います
基本型の値の変数が別の変数にコピーされると、メモリ内に新しい変数の値を格納するための格納空間が新しく開かれます.新しい変数の値とコピーされた変数の値は2つの異なる記憶空間に保存されます.
参照型の値の変数が別の変数にコピーされると、メモリに新しい空間が開けられません.新しい変数が保存されるのもメモリのオブジェクトを指すポインタです.新しい変数と古い変数が同じ記憶領域を指すので、変数の値を変更し、他の変数も変わります.
実行環境(スコープ)
グローバル実行環境に加えて、各関数にも独自の実行環境があります.ある関数を実行すると、変数オブジェクトからなる
一つ注意したいのは、javascriptの中のスコープは他のプログラミング言語と違って、ブロックレベルのスコープがありません.次の例を見てください.
ごみの収集
Javascriptは自動ごみ収集機構を持っています.実行環境はコードの実行中に使用されるメモリを管理します.
ゴミ回収メカニズムの原理:ゴミ収集器はもう使用しない変数を探し出して、その占用メモリを釈放して、ゴミ収集器は固定されたイベント周期的にメモリ回収を実行します.
不要な変数ポリシーをマークするための、実装によって異なります.具体的には、ブラウザ内のプラグインには、通常、以下の2つのポリシーがあります.
タグクリア
タグクリアは、ブラウザで最もよく使われているごみ収集方式です.変数が環境に入ると(例えば、varで変数を宣言する)、この変数を
ゴミ回収器はメモリに格納されている変数にすべてマークを付けます.変数が実行環境でアクセスできない場合は、別のマーク(環境から離れる)を付けて、次のゴミ回収器で回収すると、その占有されている保存を回収します.
参照数
もう一つのよくない回収方法は参照カウントです.参照カウントは変数が参照された回数を計算します.一つの変数が参照タイプの値に割り当てられた場合、参照タイプの値の参照回数は1を加算します.この変数が他の参照タイプの値を指す場合、参照タイプの値の参照回数は1を減らします.ごみ箱が検出されると、ごみ箱が検出されます.参照タイプの値が0に等しいと占有空間が回収されます.このようなゴミ回収メカニズムは
基本タイプと参照タイプの値
javascriptの値の種類は2つあります.
.基本タイプの値は、単純なデータセグメントを意味し、基本タイプは5種類あり、順次、Undefined
Boolean
String
Number
142 142 142 142 Null
142 142 142 142 142 142であり、参照タイプの値は複数の値からなるオブジェクトを意味する.基本タイプの値と参照タイプの値の違い
保存方法が違います
基本型の値の変数は確かな値を保存します.参照型の値の変数はポインタで、このポインタはメモリのオブジェクトを指します.
参照タイプの値は、属性と方法を動的に追加することができます.
コピー形式が違います
基本型の値の変数が別の変数にコピーされると、メモリ内に新しい変数の値を格納するための格納空間が新しく開かれます.新しい変数の値とコピーされた変数の値は2つの異なる記憶空間に保存されます.
参照型の値の変数が別の変数にコピーされると、メモリに新しい空間が開けられません.新しい変数が保存されるのもメモリのオブジェクトを指すポインタです.新しい変数と古い変数が同じ記憶領域を指すので、変数の値を変更し、他の変数も変わります.
var name = 'yuhualingfeng';
var anotherName = name;
alert(anotherName); // yuhualingfeng
anoherName = 'Jake';
alert(anotherName); // Jake
alert(name); //yuhualingfeng
上記のようにanotherName
の値が変更された場合、name
の変数の値には影響がありません.var obj = new Object();
obj.name = 'yuhualingfeng';
var anotherObj = obj;
alert(anotherObj.name); // yuhualingfeng
anotherObj.name = 'Jake';
alert(anotherObj.name); // Jake
alert(obj.name); Jake
anotherObj
オブジェクトのname
属性値を変更した後、obj
オブジェクトのname
属性値も変化しているので、両者が同じ記憶領域を指していると判断できる.実行環境(スコープ)
はJavascriptの中で最も重要な概念であり、実行環境は変数または関数がアクセスできる他のデータを定義し、それぞれの動作を定義しています.各実行環境には関連する
があります.
は最外層の実行環境であり、グローバル実行環境にはWindowsグローバルオブジェクトがあり、グローバル環境におけるすべての変数はwindowオブジェクトを通じてアクセスできます.グローバル実行環境に加えて、各関数にも独自の実行環境があります.ある関数を実行すると、変数オブジェクトからなる
が生成されます.作用ドメインチェーンの存在は、解析器が適切に識別子を見つけるためです.関数にある変数を使用すると、まず、解析器は、関数自体の変数オブジェクトにこの変数の識別子を探します.もし見つかっていないなら、この識別子が見つかるまで前の変数オブジェクトを探し続けます.識別子を検索すると、解像度は、グローバル実行環境にある変数オブジェクトの中から識別子が見つからないと、解析器がエラーを起こすことになります.var age = 30;
function changeAge(){
age = 40;
}
changeAge();
alert(age); // 40
changeAge
の作用するドメインチェーンには2つの変数オブジェクトがあり、自身の変数オブジェクトとグローバル環境の変数オブジェクトがあり、changeAge
関数を実行するとage
変数が呼び出され、解析器はまずchangeAge
変数オブジェクトの中からこの変数を検索し、見つけられませんでした.一つ注意したいのは、javascriptの中のスコープは他のプログラミング言語と違って、ブロックレベルのスコープがありません.次の例を見てください.
function test(){
for(var i = 0,len =10;i < len;i++){
doSomething(i);
console.log(i); // 10
}
}
test();
for文で定義されたage
変数は、i
文以外でアクセスできます.javascriptで定義された変数は、最近実行された環境の変数オブジェクトに追加されます.ここで、i変数をfor
関数の変数オブジェクトに追加します.ごみの収集
Javascriptは自動ごみ収集機構を持っています.実行環境はコードの実行中に使用されるメモリを管理します.
ゴミ回収メカニズムの原理:ゴミ収集器はもう使用しない変数を探し出して、その占用メモリを釈放して、ゴミ収集器は固定されたイベント周期的にメモリ回収を実行します.
不要な変数ポリシーをマークするための、実装によって異なります.具体的には、ブラウザ内のプラグインには、通常、以下の2つのポリシーがあります.
タグクリア
タグクリアは、ブラウザで最もよく使われているごみ収集方式です.変数が環境に入ると(例えば、varで変数を宣言する)、この変数を
test
としてマークします.変数が環境を離れると、この変数を
としてマークします.もちろん、この表記の方法は様々な種類があります.例えば、ある特殊なビットを反転させることによって、変数が環境に適しているか、または環境に入る変数リストと環境から離れる変数リストを使って、どの変数が変化しているかを追跡できます.ゴミ回収器はメモリに格納されている変数にすべてマークを付けます.変数が実行環境でアクセスできない場合は、別のマーク(環境から離れる)を付けて、次のゴミ回収器で回収すると、その占有されている保存を回収します.
参照数
もう一つのよくない回収方法は参照カウントです.参照カウントは変数が参照された回数を計算します.一つの変数が参照タイプの値に割り当てられた場合、参照タイプの値の参照回数は1を加算します.この変数が他の参照タイプの値を指す場合、参照タイプの値の参照回数は1を減らします.ごみ箱が検出されると、ごみ箱が検出されます.参照タイプの値が0に等しいと占有空間が回収されます.このようなゴミ回収メカニズムは
において深刻なメモリリークを引き起こすことがあります.次の例を参照してください.function Test(){
var obj1 = new Object();
var obj2 = new Object();
obj1.property = obj2;
obj2.property = obj1;
}
関数が実行された後、参照カウントのメカニズムによってゴミ回収が行われると、Obj 1が指す参照タイプ値の参照カウントは1(obj 2.propertyによって参照される)となり、Obj 2が指す参照タイプ値の参照カウントは1(obj 1.propertyによって参照される)となり、この2つの参照タイプの値は回収されない.この関数を複数回実行すると、深刻なメモリリークが発生します.この問題を解決するためには手動でメモリをリリースする必要があります.obj1.property = null;
obj2.property = null;
IEブラウザでは、IE 9の以前のバージョンのBOMとDOMのオブジェクトは参照カウントの回収メカニズムを採用していますので、私達は使用時に特に注意しなければなりません.グローバル環境の変数は、アプリケーションが終了した時だけ実行環境から離れるので、無駄な変数が使用されているメモリをできるだけ手動で解放する必要があります.