javascriptのfunctionの話

javascriptで関数を定義してみます。

function hello() {
    document.write('hello');
}

これで、helloという関数を実行できるようになります。

でも関数を即時実行したいとき、よく見るのがこの形です。

(function() {
    docuemt.write('hello');
})();

最後の呼び出し用の丸括弧はわかりますが、functionを丸括弧で囲まないといけない理由が今までよくわかっていなかったです。

どういうことか

jsでは、丸括弧で囲ったfunctionは関数式と認識するという仕様があるそうです。

// これは関数定義
function hello() {}

// これは関数式
(function () {});

式であれば即時実行が可能になります。

// これは構文Error
function hello() {}();

// これは即時実行が可能
(function () {})();

なので、即時実行をしたい場合関数を定義するのではなく、丸括弧で囲って関数式として実行しなければいけないのです。

ちなみに...

関数式はかっこで囲わなくても、エクスクラメーションマークなどでも関数式として扱うみたいです。

// これも関数式なので即時実行が可能
!function () {}();

ただ、この場合、返り値がtrueかfalseのbooleanしか返さないそうなので、よっぽどバイト数を削りたい時とか以外は、普通に丸括弧を使うのがよさそうです。