molily: Immediately-Invoked Function Expressions

Beitrag lesen

Hallo,

gute Argumente, die für die Nutzung von !, +, -, ~, void, … bei IIFEs sprechen?

Es ist soweit ich weiß alles gleichwertig, solange man JavaScript-Dateien vernünftig konkateniert (zu einer größeren Datei zusammenfasst).

(function() {})() und (function() {}()) geben sich in dieser Hinsicht nichts. Sie sind beide problematisch, wenn die vorherige Datei nicht korrekt mit einem Semikolon abschließt. Dann wird nämlich (…) als Teil der letzten Expression angesehen, und in diesem Kontext ist es ein Funktionsaufruf. Beispiel:

Datei 1: alert(1)
Datei 2: (function() {})();
Zusammengefasst: alert(1)(function() {})();

Das ist syntaktisch korrekt, aber bei der Ausführung wird es einen Fehler geben, weil alert() undefined und keine Funktion zurückgibt.

Wenn man unäre Operatoren wie !, ~ oder void verwendet, die den einzigen Operand rechts vom Operator erwarten, so gibt es einen Syntaxfehler:

Datei 1: alert(1)
Datei 2: !function() {}();
Zusammengefasst: alert(1)!function() {}();

Das ist eher erwünscht, weil es einen schnellen und eindeutigen Fehler liefert.

Es gibt viele Wege, das zu umgehen. Der einfachste ist, dafür zu sorgen, dass alle Scripte ihre Expression Statements mit einem ; abschließen. Da das bei Third-Party-Scripten nicht unbedingt garantiert werden kann, kann eine Datei auch einfach mit einem Semikolon beginnen:

;(function() {})();

Falls nichts oder ein Semikolon davor kommt, ist das einfach ein leeres Statement. Falls ein nicht geschlossenes Expression Statement devor geklebt wird, so schließt es jenes.

Intelligente Konkatenierer arbeiten m.W. mti ECMAScript-Parsern, um solche Probleme grundsätzlich zu vermeiden. Sie verstehen die Struktur und sind nicht auf gesetzte Semikola angewiesen; sie fügen sie automatisch hinzu.

Mathias