重要なことは、基本的にパーサーが関数を関数宣言として解釈しないようにしており、代わりに無名関数式として解釈されているようです。
括弧を使用して式をグループ化するか、! 戻り値を否定することは、どちらも解析を変更するための単なるテクニックです。その後、次の括弧によってすぐに呼び出されます。明示的な戻り値がないと仮定すると、これらの形式のすべてがその点で同じ正味の効果を持っています。
(function(){ /* ... */ })(); // Arguably most common form, => undefined
(function(){ /* ... */ }()); // Crockford-approved version, => undefined
!function(){ /* ... */ }(); // Negates the return, so => true
+function(){ /* ... */ }(); // Attempts numeric conversion of undefined, => NaN
~function(){ /* ... */ }(); // Bitwise NOT, => -1
戻り値をキャプチャしていない場合、大きな違いはありません。~ はビットを反転するだけなので、より高速な操作である可能性があると主張することができます。真/偽のチェックと否定を返すため、より高速な操作です。
結局のところ、ほとんどの人がこのパターンを使用する方法は、物事をクリーンに保つために新しいレベルの範囲を壊そうとすることです。ありとあらゆる仕事。後者の形式は、追加の (通常は不要な) 操作を導入しますが、すべての余分なバイトを保存すると役立つため、人気があります。
Ben Alman は、このトピックについて素晴らしい記事を書いています: http://benalman.com/news/2010/11/immediately-invoked-function-expression/