IIFEの戻り値を気にしない場合、以下のいずれかになります。
!function(){}(); // => true~function(){}(); // => -1+function(){}(); // => NaN-function(){}(); // => NaN
これをもう少し探ってみましょう。
セミコロンがない場合、括弧の各セットは直前の式を直ちに呼び出そうとします。 これは、直前の IIFE の戻り値になります。
つまり、違いは TypeError が発生するときです。 引数がどうなっているか調べてみましょう。 console.log()
は undefined を返すことに注意してください。
さて、同じ例を crockford 方式でやってみましょう。
でも待ってください、ここには TypeError がありません…
返された関数のため TypeError はありません。 このことを理解した上で、TypeError が発生した元の例に戻りましょう。
結論
(function{})();
と (function(){}());
IIFE は、セミコロンがない状況で異なる動作をすることがあります。
モジュールで作業する場合、linter やツールを使用して、モジュールの末尾のセミコロンが欠けていないことを確認します。
さらに安全にするために、IIFE に先頭のセミコロンを追加します。