私の歴史と今

振り返ると恥ずかしくなるのが私の歴史。だけどそのときは真面目に書いていた訳でね。そんな今の私を書いていく。

JavaScript 第5版 4.7 変数のスコープの再検討

「変数名の解決」(変数名を探す方法)について。
スコープチェーンはオブジェクトを並べたもの。下記コードのf2関数内では、

    1. 「f2のCallオブジェクト」
    2. →「f1のCallオブジェクト」
    3. →「グローバルオブジェクト」

という順でスコープチェーンが並んでいる。

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を解決することができない。グローバルオブジェクトでも解決できない場合は、未定義となる。