SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

!function(a){ /* */ }(arg); と (function(a){ /* */ })(arg); の違いは?

問題

即座に関数実行しているのだと思いますが、以下の2種類見かけます。

何か違うのですか?

(function(a){
    //
})(arg); 
!function(a){
    //
}(arg);

答え

大きくは違わないです。

その場で実行するという点では同じです。

関数宣言(文)と関数式(式)があり、文の後に()をつけても実行できないので、どちらの方法も式にするため(実行可能な関数を返してもらうため)の書き方になります。

文は続けて書いても大丈夫。

function test1(a){ console.log(a); } function test2(b){ console.log(b); }

改行すればいつも通りの書き方。

function test1(a){ console.log(a); }
function test2(b){ console.log(b); }

以下のように書いた場合、

function test1(a){
    console.log(a);
}(1234)

以下のように書いたのと同じことで、

function test1(a){
    console.log(a);
}

(1234)

関数の宣言(文)の後に、(1234)という式が来たという状況になります。関数に1234という引数を渡して実行するという結果にはなりません。

文ではなく式として評価されたとき、function ~ は関数そのものを返します。

文ではなく式として評価させて、()の左側に実行可能な関数が欲しいのです。

式になりさえすればなんでもよいので、以下のように演算子をつけたり、代入したりするとうまくいきます。

var x = function test1(a){
    console.log(a);
}(1234)
!function test1(a){
    console.log(a);
}(1234)
+function test1(a){
    console.log(a);
}(1234)
(function test1(a){
    console.log(a);
})(1234)

! のほうが、()よりも1文字少ないというメリットはあります。

() のほうが、戻り値をそのまま受け取れます。! は戻り値が論理値に変換されてしまいます。

関連するメモ

コメント