Jeśli nie zależy ci na wartości zwrotnej IIFE, może to być dowolny z poniższych sposobów:
!function(){}(); // => true~function(){}(); // => -1+function(){}(); // => NaN-function(){}(); // => NaN
Zbadajmy to trochę bardziej.
Oba działają tak samo. Zaczyna się robić ciekawie, gdy w jednym z modułów brakuje końcowego średnika:
Z brakującym średnikiem, każdy zestaw parens próbuje natychmiast wywołać poprzedzające wyrażenie. Byłaby to wartość zwrotna poprzedzającego IIFE.
Różnica jest więc wtedy, gdy wystąpi błąd typu. Sprawdźmy, do czego służą argumenty. Zauważ, że console.log()
zwraca undefined:
Następnie zróbmy ten sam przykład w sposób crockforda:
Ale czekaj, nie ma tu żadnego TypeError…
Nie ma TypeError z powodu zwracanej funkcji. Zwracana funkcja, która rejestruje argumenty, jest następnie wywoływana z wartością zwracaną modułu2, która jest niezdefiniowana.Z tym zrozumieniem wróćmy do oryginalnego przykładu, w którym wystąpił błąd typu:
Wniosek
Funkcje (function{})();
i (function(){}());
IIFE mogą działać inaczej w sytuacji brakującego średnika.
Użyj lintera lub innego narzędzia, aby upewnić się, że modułom nie brakuje końcowych średników podczas pracy nad modułami.
Aby być wyjątkowo bezpiecznym, dodaj wiodący średnik do IIFE: