JavaScript 第5版 4.7 変数のスコープの再検討
「変数名の解決」(変数名を探す方法)について。
スコープチェーンはオブジェクトを並べたもの。下記コードのf2関数内では、
-
- 「f2のCallオブジェクト」
- →「f1のCallオブジェクト」
- →「グローバルオブジェクト」
という順でスコープチェーンが並んでいる。
var x = 0; var y = 0; function f1(){ var x = 1; function f2(){ var x = 2; } }
f2関数内で変数xを参照した場合、まず「f2のCallオブジェクト」のプロパティを探し、なければ「f1のCallオブジェクト」、それでもなければグローバルオブジェクトのプロパティを探す。幸いに変数xは「f1のCallオブジェクト」に存在するので、1つ目のオブジェクトを探しただけで解決できる。しかし、f2関数内で変数yを参照した場合は、「f2のCallオブジェクト」→「f1のCallオブジェクト」→「グローバルオブジェクト」という順番にグローバルオブジェクトまでたどり着かないと変数yを解決することができない。グローバルオブジェクトでも解決できない場合は、未定義となる。