JavaScript: 変数+無名関数と関数リテラルの違い

Web/JS(あまくち) part.2 – 変数宣言、関数、無名関数
で関数オブジェクトの生成について触れましたが、var name = function(無名関数を変数にバインド)とする方法とリテラルとでは挙動が違うのではないかとの指摘がありました。
JavaScript の var についての考察にあるように、

  function() {
    var foo = 1;
  };

というコードは内部解釈的に見ると(インタプリタの挙動的に解釈すると)

  function() {
    var foo;
    foo = 1;
  };

となります。
という事は関数に付いても同様で、関数リテラルの場合は名前付き関数オブジェクトが先積みされ、var name = function とした場合は変数 name だけ先積みされる(name = null の状態)と考えられます。

試してみましょう。

  console.log(foo == null); // true
  console.log(typeof bar == 'function'); // true
 
  var foo = function() {
  };
 
  function bar () {
  }

ばっちり予想通りとなりました。

コメント / トラックバックはありません

コメントする