【JS】テストコード書き書きしながら関数の勉強2

前回に引き続きJavaScriptの関数の勉強です。今回はスコープ

5.3スコープと実行コンテキスト

ホイストと呼ばれる現象が起こる。
仮引数:変数オブジェクトに対応するプロパティを追加。値は実引数と一致
関数宣言:変数オブジェクトに対応するプロパティを追加。仮引数と名前がかぶったらこっちを優先
変数宣言:変数オブジェクトに対応するプロパティを追加。名前は上2つを優先。初期化前の初期値はundef
関数に関しては、グローバルで定義した時と直感的には同じで先に定義が走るという意味です。
変数は下記例を参照。Rubyでも同じような事が起こります。

test("scopeTest", 3, function(){
  function sum() {
    // まだ宣言してないけどundef
    equal(i, undefined, "i is undefined");

    // 後に宣言しないものはundefでなくエラー
    throws(function(){
      equal(someVar, undefined, "i is undefined");
    }, "ReferenceError");

    var total = arguments[0];

    if (arguments.length > 1){
      for (var i = 0, l = arguments.length; i < l; i++) {
        total += arguments[i];
      };
    }

    // スコープ外のように思えるが残っている
    equal(i, 5, "i = 5");

    return total;
  }

  sum(1,2,3,4,5);

});