Ha nem érdekel az IIFE visszatérési értéke, akkor a következők bármelyike lehet:
!function(){}(); // => true~function(){}(); // => -1+function(){}(); // => NaN-function(){}(); // => NaN
Vizsgáljuk meg ezt egy kicsit jobban.
Mindkettő ugyanúgy működik. Akkor kezd érdekessé válni a dolog, amikor az egyik modulból hiányzik az utolsó pontosvessző:
A hiányzó pontosvesszővel minden egyes zárójelcsoport megpróbálja azonnal megidézni az előző kifejezést. Ez lenne az előző IIFE visszatérési értéke.
A különbség tehát az, amikor a TypeError bekövetkezik. Nézzük meg, mire készülnek az argumentumok. Figyeljük meg, hogy a console.log()
undefined visszatér:
Most csináljuk ugyanezt a példát a crockfordi módon:
De várjunk csak, itt nincs TypeError…
Nincs TypeError a visszaadott függvény miatt. A visszaadott függvényt, amely az argumentumokat naplózza, a modul2 visszatérési értékével hívják meg, ami nem definiált.Ezzel a megértéssel térjünk vissza az eredeti példához, ahol TypeError volt:
Következtetés
A (function{})();
és (function(){}());
IIFE-k eltérően viselkedhetnek a hiányzó pontosvessző szituációban.
A modulokkal való munka során használj lintert vagy egy eszközt, hogy megbizonyosodj arról, hogy a modulokból nem hiányzik az utolsó pontosvessző.
Az extra biztonság kedvéért adj hozzá egy vezető pontosvesszőt az IIFE-hez: