(function() {})()とかnew function() {}とか

一昔前に (function(){})() とか new function() {} とか function() {}() とかは何やねんという記事が流行った??時期がありました。

あの時は、いくつか記事を読んでも正直もう何が何だかわからなかったのですが、久しぶりに紐解いてみるとちょっとはわかったような気がしたのでメモ。

まず、(function() {})()とかnew function() {}の違い

これに関しては、ココが非常に単純明解です。
こちらも参照。

つまり、

  • (function(){})()
    • 無名関数を今すぐ実行
    • 最後の () が今すぐ実行するということ
    • ロード後1度だけ実行
// 無名関数をすぐに実行
(function(){
    // 初期化処理などを行う
    alert('test1');
})();
  • new function() {}
    • 無名オブジェクトを作成して、その場で new することでインスタンス生成(=無名コンストラクタ実行)
    • ロード後1度だけ実行
new function() {
    // 初期化処理などを行う
    alert('test2');
}

function(){} () は何者か??

例えば、よくみかける

var test3 = function() {
    return 'test3';
};

というのは、

var test3 = function() {
    return 'test3';
};
alert(test3)

だと、

function() {
    return 'test3';
};

というように、関数の文字列自体がalertされます。
なので、

var test3 = function() {
    return 'test3';
};
alert(test3()) // test3 じゃなくて test3()とする

とtest3が関数として見做され、「test3」 という文字列がalertされます。
つまり、変数test3は、関数自身を参照している?ことになる・・・のかな??

では、本題の下記はどうかと言うと

var test4 = function() {
    return 'test4';
}();
alert(test4);

は、「test4」という文字列が表示されます。
つまり変数test4は実行結果が代入されていることになります。
で、

var test4 = function() {
    return 'test4';
}();
alert(test4());

は、firebugだと、「test4 is not a function」とエラーになります。
つまり、上記の変数test4は、実行結果なので関数じゃないよ、って怒られているようです。
となると、単に関数宣言の後に () があると今すぐ実行になるよ、ってだけの話のようです。

という結論が、もっと詳しくココに書いてあります。

ちなみに

式と文の件はもうお腹一杯なので、ココとか、見るといいかもしれません。
あと、この記事は勉強になりました。
以上、今更ですがメモ程度に。