Heim >Web-Frontend >js-Tutorial >js führt Funktionen sofort aus: Was ist der Unterschied zwischen (function ( ){})( ) und (function ( ){}( ))?_Javascript-Kenntnisse
Kein Unterschied.
Sie müssen das Prinzip von IIFE verstehen, lassen Sie es mich kurz erklären:
IIFE ist nicht erforderlich. Um es traditioneller zu machen, können Sie es so schreiben:
Warum also IIFE?
1. Die traditionelle Methode ist umständlich und die Definition und Ausführung werden separat geschrieben
2. Die herkömmliche Methode verschmutzt direkt den globalen Namespace (globales Objekt im Browser, z. B. Fenster)
Deshalb möchten Entwickler einen Weg finden, die oben genannten Probleme zu lösen. Ist es also in Ordnung, so zu schreiben?
Funktion foo(...){}();
Natürlich nicht, aber warum? Da der Funktionsteil foo(...){} nur eine Anweisung ist, ist es für den Interpreter so, als hätten Sie eine Zeichenfolge „function foo(...){}“ geschrieben, die die Verwendung von Analysefunktionen erfordert, z eval() um es auszuführen. Wenn Sie also () direkt nach der Anweisung einfügen, wird dies nicht ausgeführt, was eine falsche Syntax darstellt.
Wie macht man es richtig? Es ist leicht zu sagen: Verwandeln Sie die Aussage einfach in einen Ausdruck (Ausdruck).
Tatsächlich gibt es viele Möglichkeiten, Ausdrücke zu transformieren. Die häufigste Methode besteht darin, die Funktionsdeklaration mit einem Paar () zu umschließen, sodass Folgendes entsteht:
Dies entspricht:
Aber die Art und Weise, wie wir vorher gesagt haben, dass es unmöglich war, zu schreiben, kann tatsächlich direkt in Klammern gesetzt werden. Dies ist auch ein äquivalenter Ausdruck:
(function foo(){...}());
Sie fragen sich also: Gibt es einen Unterschied? Ganz einfach: Nein~
Außerdem gibt es, wie ich gerade sagte, viele Möglichkeiten, Ausdrücke umzuwandeln, und es gibt tatsächlich viele andere Möglichkeiten, sie zu schreiben, wie zum Beispiel:
!function foo() {...}();
oder
Funktion foo() {...}();
Das ist alles in Ordnung.
Ich persönlich bevorzuge die Verwendung von void zum Konvertieren von Ausdrücken, da dieses Schlüsselwort keinen Rückgabewert hat. Aber dieser Punkt ist wirklich egal, behandle mich einfach wie eine „Schildkröte“…
OK, die sogenannte Nichtverschmutzung des globalen Namespace liegt daran, dass IIFE einen neuen Funktionsumfang erstellt und Ihr echter Geschäftscode darin gekapselt ist, sodass er das globale Objekt natürlich nicht berührt. Wenn Sie das globale Objekt benötigen, übergeben Sie es an IIFE:
Ich habe hier eine Serie geschrieben, in der es um Umfang und Namensförderung geht. Die darin enthaltenen Wissenspunkte sind hilfreich für das Verständnis von IIFE. Wenn Sie interessiert sind, können Sie weiterlesen: http://. www.jb51 .net/article/75090.htm
Methode eins: Rufen Sie die Funktion auf und erhalten Sie den Rückgabewert. Erzwingt die direkte Ausführung der Funktion und gibt dann eine Referenz zurück, die dann aufgerufen und ausgeführt wird
Methode zwei: Rufen Sie die Funktion auf und erhalten Sie den Rückgabewert. Der Zwangsoperator bewirkt, dass Funktionsaufrufe ausgeführt werden
(function(){})(); besteht darin, die Funktion als Ausdruck zu analysieren und dann die analysierte Funktion
auszuführen
Äquivalent zu var a = function(){}; a(); a erhält die Funktion
(function(){}()); besteht darin, den Funktionsausdruck direkt auszuführen und als Anweisung auszuführen,
Äquivalent zu var a = function(){}(); a erhält das Ergebnis
Das Endergebnis ist das gleiche,
() spielt lediglich die Rolle der Selbstausführung
Es gibt noch viele weitere wie ()
Zum Beispiel Funktion (){}
Dies entspricht (function (){}). Im Allgemeinen hat (function (){}) einen weiteren Effekt, nämlich die Vermeidung globaler Variablen