スコープ分類
1, レキシカルスコープ / スタティックスコープ: js use
2、ダイナミックスコープ:バッシュ使用
スコープチェーン
変数を探すときは、まず現在のコンテキストにある変数オブジェクトを探し、見つからなければ親の実行コンテキストにある変数オブジェクトから、つまりグローバルコンテキストにある変数オブジェクトまで調べます。このような複数の実行コンテキストからの変数オブジェクトの連鎖をスコープチェーンと呼びます。
関数作成
関数のスコープは関数定義時に決定されます。
これは関数が内部属性[[スコープ]]を持っているためで、関数が生成されるとすべての親変数オブジェクトがその中に保存されます。[[スコープ]]はすべての親変数オブジェクトの階層的な連鎖であると理解できますが、注意:[[スコープ]]は完全なスコープ連鎖を表しているわけではありません!
一例です:
function foo() {
function bar() {
...
}
}
関数はそれぞれの[[スコープ]]で作成されます:
foo.[[scope]] = [
globalContext.VO
];
bar.[[scope]] = [
fooContext.AO,
globalContext.VO
];
関数活性化
ファンクションがアクティブになると、ファンクションコンテキストに入り、VO/AOを作成した後、アクティブオブジェクトがスコープチェーンの先頭に追加されます。
Scopeという実行コンテキストのスコープチェーンが実行されるときです:
Scope = [AO].concat([[Scope]]);
この時点で、スコープチェーンが作成されます。