JavaScript実行環境とスコープ【チェーン】
2272 ワード
実行環境(execution context):変数や関数がアクセスできる他のデータを定義し、それぞれの行動を決定しました.
変数オブジェクト:各実行環境には、関連する変数オブジェクトがあります.環境で定義されているすべての変数と関数は、このオブジェクトに保存されます.私たちが作成したコードはこの変数にアクセスできませんでしたが、解析器はデータを処理する時にバックグラウンドで使います.
グローバル実行環境:グローバル実行環境は最も周辺的な実行環境であり、ECMAScriptによって既存の宿主環境を実現することによって、実行環境を示すオブジェクトも異なる.ウェブブラウザでは、グローバル実行環境はwindowオブジェクトとして認識されていますので、すべてのグローバル変数と関数は、windowオブジェクトの属性と方法として作成されます.
環境ライフサイクルを実行します.ある実行環境のコードが全部実行された後、この環境は破壊され、その中に保存されているすべての変数と関数の定義も破壊されました.
各関数は自分の実行環境を持っています.実行ストリームが関数に入ると、関数の環境が環境スタックに押し込まれます.関数が実行された後、スタックはその環境をイジェクトし、制御権を前の実行環境に戻す.
スコープチェーン(scope chain):現代ですか?一つの環境で実行すると変数オブジェクトの一つのスコープチェーンが作成されます.作用するドメインチェーンの用途は、実行環境にアクセスできるすべての変数と関数に対する規則的なアクセスを保証することである.
スコープの先端は、常に現在実行されているコードのある環境の変数オブジェクトです.この環境が関数である場合、その活動対象を変数オブジェクトとします.活動対象は最初に一つの変数だけを含んでいます.つまり、argmentsオブジェクト(このオブジェクトはグローバル環境には存在しません.)
フィールドチェーンの次の変数オブジェクトは環境を含むものから来ます.次の変数オブジェクトは環境を含むものから来ます.このようにして、グローバル実行環境に至るまで継続します.グローバル実行環境の変数オブジェクトは常にフィールドチェーンの最後のオブジェクトです.
識別子解析は、スコープに沿って識別子を1段階ずつ検索するプロセスである.検索は常にスコープの先端から始まり、識別子が見つかるまで段階的に後へ遡ります.見つからない場合はエラーが発生します.
サンプルコード:
-自分の変数のオブジェクト(その最初のオブジェクトはargments)
-グローバル環境の変数オブジェクト
window
ヽoo.ツ
|-change Color()
関数内部で変数カラーにアクセスできるのは、このスコープ内で彼を見つけることができるからであり、内部環境はスコープチェーンを介してすべての外部環境にアクセスできるが、外部環境は内部環境のいずれかの変数と関数にアクセスできない.これらの環境間の連絡は直線的で順序的である.各環境は、フィールドチェーン、クエリー変数、関数名を上に検索できます.しかし、次の検索機能のドメインチェーンは他の実行環境に入ることはできません.
実行環境の種類は全部で二つあります.
-グローバル
-ローカル(関数)
スコープチェーンを延長します.次のいずれかのステートメントにストリームが入ると、スコープチェーンは延長されます.
-try-catch文のcatchブロックは、ドロップされたエラーオブジェクトの宣言を含む新しい変数オブジェクトを作成します.
-with文のペアは、指定されたオブジェクトをスコープに追加します.
ブロックレベルのスコープがない:JavaScriptはブロックレベルのスコープがない、すなわち{}閉じられたコードを使って自分のスコープがないということは、いくつかの{}で定義された変数が現在の実行環境に追加されることを意味し、ifまたはfor文を使用する.
変数オブジェクト:各実行環境には、関連する変数オブジェクトがあります.環境で定義されているすべての変数と関数は、このオブジェクトに保存されます.私たちが作成したコードはこの変数にアクセスできませんでしたが、解析器はデータを処理する時にバックグラウンドで使います.
グローバル実行環境:グローバル実行環境は最も周辺的な実行環境であり、ECMAScriptによって既存の宿主環境を実現することによって、実行環境を示すオブジェクトも異なる.ウェブブラウザでは、グローバル実行環境はwindowオブジェクトとして認識されていますので、すべてのグローバル変数と関数は、windowオブジェクトの属性と方法として作成されます.
環境ライフサイクルを実行します.ある実行環境のコードが全部実行された後、この環境は破壊され、その中に保存されているすべての変数と関数の定義も破壊されました.
各関数は自分の実行環境を持っています.実行ストリームが関数に入ると、関数の環境が環境スタックに押し込まれます.関数が実行された後、スタックはその環境をイジェクトし、制御権を前の実行環境に戻す.
スコープチェーン(scope chain):現代ですか?一つの環境で実行すると変数オブジェクトの一つのスコープチェーンが作成されます.作用するドメインチェーンの用途は、実行環境にアクセスできるすべての変数と関数に対する規則的なアクセスを保証することである.
スコープの先端は、常に現在実行されているコードのある環境の変数オブジェクトです.この環境が関数である場合、その活動対象を変数オブジェクトとします.活動対象は最初に一つの変数だけを含んでいます.つまり、argmentsオブジェクト(このオブジェクトはグローバル環境には存在しません.)
フィールドチェーンの次の変数オブジェクトは環境を含むものから来ます.次の変数オブジェクトは環境を含むものから来ます.このようにして、グローバル実行環境に至るまで継続します.グローバル実行環境の変数オブジェクトは常にフィールドチェーンの最後のオブジェクトです.
識別子解析は、スコープに沿って識別子を1段階ずつ検索するプロセスである.検索は常にスコープの先端から始まり、識別子が見つかるまで段階的に後へ遡ります.見つからない場合はエラーが発生します.
サンプルコード:
var clolor = "blue";
function changeColor(){
if (color === "blue"){
color = "red";
} else {
color = "blue";
}
}
changeColor();
console.log("Color: " + color);
上記では、関数changeColor()の作用ドメインチェーンには、2つのオブジェクトが含まれています.-自分の変数のオブジェクト(その最初のオブジェクトはargments)
-グローバル環境の変数オブジェクト
window
ヽoo.ツ
|-change Color()
関数内部で変数カラーにアクセスできるのは、このスコープ内で彼を見つけることができるからであり、内部環境はスコープチェーンを介してすべての外部環境にアクセスできるが、外部環境は内部環境のいずれかの変数と関数にアクセスできない.これらの環境間の連絡は直線的で順序的である.各環境は、フィールドチェーン、クエリー変数、関数名を上に検索できます.しかし、次の検索機能のドメインチェーンは他の実行環境に入ることはできません.
実行環境の種類は全部で二つあります.
-グローバル
-ローカル(関数)
スコープチェーンを延長します.次のいずれかのステートメントにストリームが入ると、スコープチェーンは延長されます.
-try-catch文のcatchブロックは、ドロップされたエラーオブジェクトの宣言を含む新しい変数オブジェクトを作成します.
-with文のペアは、指定されたオブジェクトをスコープに追加します.
ブロックレベルのスコープがない:JavaScriptはブロックレベルのスコープがない、すなわち{}閉じられたコードを使って自分のスコープがないということは、いくつかの{}で定義された変数が現在の実行環境に追加されることを意味し、ifまたはfor文を使用する.
for (var i = 0; i<10; i++){
doSomething(i);
}
console.log(i); // 10
宣言変数:var宣言を使用する変数は、最も近い環境に自動的に追加されます.関数の内部はローカル環境です.初期化変数がvar宣言されていない場合、変数は自動的にグローバル環境に追加されます(厳密なモードでは、宣言されていない変数を初期化するとエラーが発生します).