JavaScript変数のスコープとメモリの問題(二)
2250 ワード
実行環境はjsの中で特に重要な概念です.変数や関数が他のデータにアクセスでき、自分の行動を定義することです.各実行環境には変数オブジェクトがあります.実行環境で定義されているすべての変数と関数はこの変数に保存されています.この変数は見えません.しかし、バックグラウンドが見えます. グローバル変数の実行環境は、最も周辺の実行環境であり、webブラウザでは、グローバル実行環境はwindowオブジェクトであるため、すべての関数とグローバル変数は、windowオブジェクトの属性として使用することができます.その他の実行環境はすべて関数と変数の実行が終わった後にメモリを破壊して、変数と関数も次に廃棄して、大域変数もページあるいはブラウザーを閉じる時破壊します. 「コードが環境で実行されると、変数オブジェクトのスコープチェーンが作成されます.スコープチェーンの用途は、環境にアクセスできるすべての変数と関数に関する規則的なアクセスを保証します.スコープの先端は、常に現在実行されているコードのある環境の変数オブジェクトです.この環境が関数であれば、そのアクティブなオブジェクトを(activation oject)は変数のオブジェクトとして使用されます.活動対象は最初に一つの変数だけを含んでいます.すなわち、argmentsオブジェクト(このオブジェクトはグローバル環境には存在しません.)環境、そして次の変数オブジェクトは、次の環境を含むものから来ます.このようにして、グローバル実行環境に継続します.グローバル実行環境の変数オブジェクトは、常にフィールドチェーンの最後のオブジェクトです. 私達は多くの特に重要な情報を得ることができます.ドメインチェーンの役割は、実行環境のすべての変数と関数に対して、秩序正しくアクセスすることを保証します.この順序は、作用ドメインチェーンの最前線はarguentオブジェクトで、最後の端はグローバル実行環境のwindowオブジェクトです.以下の例を見てください.
二.スコープの延長 一部の語句は実行時に作用域のスタックの先端に変数オブジェクトを一時的に入れて、文の実行が完了したらクリアして、作用領域を延長します.次の二つの語句は作用領域を延長します. 1.try-catch文のcatch文 2.with文:
ここで、with文はlocationオブジェクトを受信するので、その変数オブジェクトにはlocationオブジェクトのすべての属性と方法が含まれています.この変数オブジェクトは、作用するドメインチェーンの先端に追加されます.buildUrl関数には変数qsが定義されています.with文で変数hrefを参照すると(実際に参照するのはlocations.hrefです.)は、現在実行されている環境の変数オブジェクトにあります.変数qsを参照すると、参照はbuildUrl()です.で定義されている変数は、関数環境の変数オブジェクトにあります.with文の内部ではurlという変数が定義されていますので、urlは関数実行環境の一部となります.関数としての値は戻ります.3.ブロックレベルなしのスコープ1.他の言語では、括弧で囲まれているのは変数のスコープです.循環文などの作用領域です.などがありますが、jsはブロックレベルのスコープがありません.2.jsは変数を宣言する時、varがなければ、デフォルトはグローバル変数です.3.jsは識別子を検索します.順番はまずローカルスコープで調べて、グローバルスコープで調べます.
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
// color、anotherColor tempColor
}
// color anotherColor, tempColor
swapColors();
}
// color
changeColor();
二.スコープの延長 一部の語句は実行時に作用域のスタックの先端に変数オブジェクトを一時的に入れて、文の実行が完了したらクリアして、作用領域を延長します.次の二つの語句は作用領域を延長します. 1.try-catch文のcatch文 2.with文:
function buildUrl() {
var qs = "?debug=true";
with(location){
var url = href + qs;
}
return url;
}
ここで、with文はlocationオブジェクトを受信するので、その変数オブジェクトにはlocationオブジェクトのすべての属性と方法が含まれています.この変数オブジェクトは、作用するドメインチェーンの先端に追加されます.buildUrl関数には変数qsが定義されています.with文で変数hrefを参照すると(実際に参照するのはlocations.hrefです.)は、現在実行されている環境の変数オブジェクトにあります.変数qsを参照すると、参照はbuildUrl()です.で定義されている変数は、関数環境の変数オブジェクトにあります.with文の内部ではurlという変数が定義されていますので、urlは関数実行環境の一部となります.関数としての値は戻ります.3.ブロックレベルなしのスコープ1.他の言語では、括弧で囲まれているのは変数のスコープです.循環文などの作用領域です.などがありますが、jsはブロックレベルのスコープがありません.2.jsは変数を宣言する時、varがなければ、デフォルトはグローバル変数です.3.jsは識別子を検索します.順番はまずローカルスコープで調べて、グローバルスコープで調べます.
var color = "blue";
function getColor(){
var color = "red";
return color;
}
//"red"
alert(getColor());