reponの勉強メモ

主に勉強したことのメモです。

関数宣言(文)と関数式の違いがわからない

関数宣言(文)

function func(){}

関数式

var func = function(){}

ですが、クロージャを定義した際の動作が異なりました。

クロージャの作成

function func(){
  var n=1;
  return function(){
    return n++;
  }
}

または

var func = function(){
  var n=1;
  var innerFunc(){
    return n++;
  }
  return innerFunc;
}

これを関数式で実行すると、

var hoge = func();
hoge() // 1
hoge() // 2
hoge() // 3

ですが、関数宣言

func()() // 1
func()() // 1
func()() // 1

でした。

関数宣言の場合、関数の巻き上げにより 関数宣言前でも実行ができるが、 関数式の場合は変数のみが巻き上げられるため関数式以降でないと実行できない。 (関数宣言と関数式の違い)

この部分だと思うのですが、ではなぜクロージャに対して結果が異なるのか、自分ではうまく説明できません。