!function () {}();
javascript
function
Sebastian Otto
quelle
quelle
Antworten:
JavaScript-Syntax 101. Hier ist eine Funktionsdeklaration :
Beachten Sie, dass es kein Semikolon ist: dies ist nur eine Funktion Erklärung . Sie benötigen einen Aufruf,
foo()
um die Funktion tatsächlich auszuführen.Wenn wir nun das scheinbar harmlose Ausrufezeichen hinzufügen:
!function foo() {}
Es verwandelt es in einen Ausdruck . Es ist jetzt ein Funktionsausdruck .Das
!
allein ruft die Funktion natürlich nicht auf, aber wir können jetzt()
am Ende setzen: Das!function foo() {}()
hat eine höhere Priorität als!
und ruft die Funktion sofort auf.Der Autor speichert also ein Byte pro Funktionsausdruck. Eine besser lesbare Schreibweise wäre:
Zuletzt
!
wird der Ausdruck true zurückgegeben. Dies liegt daran, dass standardmäßig alle IIFE-Rückgabenundefined
, die uns mit!undefined
welchen zurücklassentrue
. Nicht besonders nützlich.quelle
!
gibt boolean zurück, das wissen wir alle, aber der große Punkt, den Sie ansprechen, ist, dass es auch die Funktionsdeklarationsanweisung in einen Funktionsausdruck konvertiert, sodass die Funktion sofort aufgerufen werden kann, ohne sie in Klammern zu setzen. Nicht offensichtlich und eindeutig die Absicht des Codierers.var foo =
bricht die Mehrdeutigkeit von Aussage / Ausdruck und Sie können einfach schreibenvar foo = function(bar){}("baz");
usw.Die Funktion:
gibt nichts zurück (oder undefiniert).
Manchmal möchten wir eine Funktion direkt beim Erstellen aufrufen. Sie könnten versucht sein, dies zu versuchen:
aber es ergibt sich ein
SyntaxError
.Wenn Sie den
!
Operator vor der Funktion verwenden, wird er als Ausdruck behandelt, sodass wir ihn aufrufen können:Dies wird auch das boolean Gegenteil von dem Rückgabewert der Funktion zurückgegeben werden , in diesem Fall
true
, da!undefined
isttrue
. Wenn Sie möchten, dass der tatsächliche Rückgabewert das Ergebnis des Aufrufs ist, versuchen Sie es folgendermaßen:quelle
!
ist es, die Funktionsdeklaration in einen Funktionsausdruck umzuwandeln, das ist alles.!function
SyntaxEs gibt einen guten Punkt für die Verwendung
!
für den Funktionsaufruf, der im Airbnb-JavaScript-Handbuch markiert istIm Allgemeinen sollten Sie diese Technik für separate Dateien (auch als Module bezeichnet) verwenden, die später verkettet werden. Die Einschränkung hierbei ist, dass Dateien von Tools verkettet werden sollen, die die neue Datei in die neue Zeile setzen (was bei den meisten Concat-Tools ohnehin üblich ist). In diesem Fall
!
hilft die Verwendung, Fehler zu vermeiden, wenn das zuvor verkettete Modul das nachfolgende Semikolon verpasst hat, und bietet dennoch die Flexibilität, sie ohne Bedenken in eine beliebige Reihenfolge zu bringen.Funktioniert genauso wie
speichert aber ein Zeichen und willkürlich sieht besser aus.
Und übrigens jeder von
+
,-
,~
,void
haben Betreiber die gleiche Wirkung in Bezug auf die Funktion aufgerufen wird , sicher , wenn Sie etwas zu verwenden , haben von dieser Funktion zurück sie anders handeln würde.Wenn Sie jedoch IIFE-Muster für eine Datei verwenden, um einen Modulcode zu trennen, und das Concat-Tool zur Optimierung verwenden (wodurch eine Zeile zu einem Dateijob wird), wird die Konstruktion ausgeführt
Führt eine sichere Codeausführung durch, genau wie bei einem ersten Codebeispiel.
Dieser wird einen Fehler auslösen, da JavaScript ASI seine Arbeit nicht ausführen kann.
Ein Hinweis zu unären Operatoren: Sie würden ähnliche Arbeiten ausführen, aber nur für den Fall, dass sie nicht im ersten Modul verwendet werden. Sie sind also nicht so sicher, wenn Sie nicht die vollständige Kontrolle über die Verkettungsreihenfolge haben.
Das funktioniert:
Dies nicht:
quelle
Es wird zurückgegeben, ob die Anweisung als falsch ausgewertet werden kann. z.B:
Sie können es zweimal verwenden, um einen Wert in einen Booleschen Wert zu zwingen:
Um Ihre Frage direkter zu beantworten:
Bearbeiten: Dies hat den Nebeneffekt, dass die Funktionsdeklaration in einen Funktionsausdruck geändert wird. Der folgende Code ist beispielsweise ungültig, da er als Funktionsdeklaration interpretiert wird, bei der der erforderliche Bezeichner (oder Funktionsname ) fehlt :
quelle
var myVar = !function(){ return false; }()
könnte weglassen der!
wievar myVar = function(){ return false; }()
und die Funktion wird ausgeführt , korrekt und der Rückgabewert wird unberührt.true
mit!0
undfalse
mit!1
. Es werden 2 oder 3 Zeichen gespeichert.Es ist nur, um ein Datenbyte zu speichern, wenn wir Javascript-Minimierung durchführen.
Betrachten Sie die unten stehende anonyme Funktion
Um das Obige als selbstaufrufende Funktion zu verwenden, ändern wir im Allgemeinen den obigen Code als
Jetzt haben wir zwei zusätzliche Zeichen hinzugefügt,
(,)
abgesehen vom Hinzufügen()
am Ende der Funktion, die zum Aufrufen der Funktion erforderlich sind. Bei der Minimierung konzentrieren wir uns im Allgemeinen darauf, die Dateigröße zu reduzieren. Wir können also auch die obige Funktion als schreibenTrotzdem sind beide selbstaufrufende Funktionen und wir speichern auch ein Byte. Anstelle von 2 Zeichen haben
(,)
wir nur ein Zeichen verwendet!
quelle
! ist ein logischer NOT- Operator, es ist ein boolescher Operator, der etwas in das Gegenteil invertiert.
Obwohl Sie die Klammern der aufgerufenen Funktion umgehen können, indem Sie BANG (!) Vor der Funktion verwenden, wird die Rückgabe dennoch invertiert, was möglicherweise nicht Ihren Wünschen entspricht. Wie im Fall eines IEFE würde es undefiniert zurückgeben , was beim Invertieren zum booleschen Wert true wird.
quelle
Durch das Ausrufezeichen gibt jede Funktion immer einen Booleschen Wert zurück.
Der Endwert ist die Negation des von der Funktion zurückgegebenen Werts.
Das Weglassen
!
wäre eine in den obigen Beispielen Syntax .Ein besserer Weg, dies zu erreichen, wäre jedoch:
quelle
!
Ändert die Art und Weise, wie die Laufzeit die Funktion analysiert. Dadurch behandelt die Laufzeit die Funktion als Funktionsausdruck (und nicht als Deklaration). Auf diese Weise kann der Entwickler die Funktion sofort mithilfe der()
Syntax aufrufen .!
wendet sich auch selbst (dh Negation) auf das Ergebnis des Aufrufs des Funktionsausdrucks an.Es ist eine andere Art, IIFE (sofort aufgerufener Funktionsausdruck) zu schreiben.
Seine andere Art zu schreiben -
gleich wie
quelle
(function (args) {...})()
Syntax strikt bevorzugen und diese!function
Form den Minimierungs- und Verschleierungswerkzeugen überlassen .!
negiert (entgegengesetzt) alles, was Sie als Ergebnis erwarten, dh wenn Sie habenWenn Sie anrufen
boy
, wird Ihr Ergebnis seintrue
, aber in dem Moment, in dem Sie das!
beim Anrufen hinzufügenboy
,!boy
wird Ihr Ergebnis seinfalse
. Mit anderen Worten, Sie meinen NotBoy , aber diesmal ist es im Grunde ein boolesches Ergebnis, entwedertrue
oderfalse
.Das ist das gleiche, was mit dem
!function () {}();
Ausdruck passiert.function () {}();
Wenn Sie nur ausführen, wird ein Fehler angezeigt. Wenn Sie jedoch!
direkt vor Ihremfunction () {}();
Ausdruck hinzufügen , ist dies das Gegenteil von dem,function () {}();
was Sie zurückgeben solltetrue
. Beispiel ist unten zu sehen:quelle