いろんな書き方があるよ! というエントリを見つけたので。

ボクは、最初に登場する、(function(){})() 派ですね。

ボクも昔、これに嵌まりました。その理由は、コード上で関数リテラルと関数オブジェクトの見分け方が理解できてなかったから。
1) function(){} は関数リテラル。
2) 最初に関数オブジェクトに変換した上で、 (function(){})
3) 引数を受け付ける括弧を書く。(function(){})() 

ここで、「括弧で囲う書き方は、処理順を操作する演算子」と捉えて以下を読んで欲しい。


例えば、こんな書き方。

// 1)関数定義 リテラルを書く。
var hoge = function(){ console.log('- function hoge '); }
// 2)関数実行 代入されて関数オブジェクトになった1)に、引数受付の括弧を加える。
hoge();

// 変数への代入もせず、ワンライナーで書きたい。
(function(){ console.log('- function hoge '); })(); 

という思考をコードに体現してるのは、(function(){})() だと感じるんですよね。たぶん、この書き方は返値の有無に関わらず、コードも読んだままの意味になる書き方。― prototype.js や jQuery.js が登場し、JavaScriptに「クロージャ」が話題になった頃からよく利用されてる書き方でもあります。ボクは、これを、「即時実行関数」と読んでます。
クロージャって、即時実行関数を応用し、スコープの違う変数に値を保持させてるのが特徴だよな。と思うことも。


さて、リンク先もそうですが、ここでも今更感がある無名関数ネタ。
様々なバリエーションを生み出してる理由なんだけど、コードリーディングには必須になる知識なので。

敢えて示す理由は、「関数リテラルは演算子と共に記述することで関数オブジェクトになる」て仕様があるから。(リンク先でも、「文法的に Function Declaration になるのが問題だから…」とありますね。)
読んでて、「void ~は確かに格好良いな」とか感じたのですが、返値のある「即時実行関数」の場合、「void じゃ無いじゃんw」とコードを読んだ人間の脳内には矛盾が生じると思ったので、ダメだろとかね。
+ や - の演算子も有効なのは知ってたんですけど、これも返値によっては、コードを読んだ人間の脳内には矛盾が生じると思う。
! 演算子は、まぁ、「注目しろ!即時実行する箇所だよ!」てな風に、単純にboolean の返却に拘らなくてもいいと感じるので賛同できるかなぁ。

「即時実行関数」と考えるなら、最初の書き方か、! を使った書き方の方がわかりやすいのでは無いでしょうか。
個人的には「秀丸で 対応する括弧の始点、終点間にカーソルをジャンプする機能」をショートカットキーに割り当てて使ってるので! でなく、 () なんです。ハイ。


余談だけど、new演算子で new function(){}() と書くと、オブジェクト生成する。
まぁ、混乱の元なので使わないけど。


// new function(){this.hoge='ほげ';}().hoge; // エラー
// 括弧で囲って、処理順を明確にするとOK
(new function(){this.hoge='ほげ';}()).hoge; // "ほげ"


括弧で囲う書き方は、JSONをオブジェクト化するのに使われていた過去もある。


// 危険なので、今は JSON.parse() を使うのだけど、昔は、こう書かれてた。
var oj = eval("("+json+")");