[javascript] Q. スコープチェーンとは?

A.
JavaScriptはスクリプトが実行されるとグローバルオブジェクトを作成し、
グローバル関数、グローバル変数を使えるように準備します。
グローバル関数は、グローバルオブジェクトのメソッド
グローバル変数は、グローバルオブジェクトのプロパティ
であると言い換える事ができます。

ローカル変数についてみてゆきましょう。
JavaScriptでは関数が呼び出されると内部的にActivationオブジェクト(Callオブジェクト)が生成されます。
ローカル変数は、Activationオブジェクトのプロパティであると言い換える事ができます。

Activationオブジェクトは関数が呼び出させると自動的に作成され、
関数が使われてないと判断した時点で自動的に削除されます。

グローバルオブジェクトとActivationオブジェクト
js_scope_c1.png

これらのグローバルオブジェクトとActivationオブジェクトを入れ子に作成した場合
生成した順にリストに連結したリストをスコープチェーンと呼びます。
変数の解決にはこのスコープチェーンが利用されています。
スコープチェーンの先頭のオブジェクトにプロパティが定義されているか確認し、
見つからなければチェーンの次のオブジェクトに移りプロパティが定義されているか確認します。
グローバルオブジェクトまで検索し、見つからなかった場合 未定義 を返します。

js_scope_c2.png