Heim >Web-Frontend >js-Tutorial >js führt Funktionen sofort aus: Was ist der Unterschied zwischen (function ( ){})( ) und (function ( ){}( ))?_Javascript-Kenntnisse

js führt Funktionen sofort aus: Was ist der Unterschied zwischen (function ( ){})( ) und (function ( ){}( ))?_Javascript-Kenntnisse

WBOY
WBOYOriginal
2016-05-16 15:31:191074Durchsuche

Kein Unterschied.

Sie müssen das Prinzip von IIFE verstehen, lassen Sie es mich kurz erklären:

Code kopieren Der Code lautet wie folgt:

function foo() {...} // Dies ist eine Definition, Deklaration; die Definition teilt dem Interpreter nur mit, dass sie existiert, aber sie wird nicht ausgeführt.
foo(); // Dies ist eine Anweisung. Der Interpreter führt sie aus, wenn er auf eine Anweisung trifft.

IIFE ist nicht erforderlich. Um es traditioneller zu machen, können Sie es so schreiben:

Code kopieren Der Code lautet wie folgt:

Funktion foo() {...}
foo();

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:

Code kopieren Der Code lautet wie folgt:

(function foo() {...}) // Dies ist ein bewusster Zeilenumbruch und kann tatsächlich mit den folgenden Klammern
verbunden werden ();

Dies entspricht:

Code kopieren Der Code lautet wie folgt:

var foo = function () {...}; // Dies ist keine Definition, sondern ein Ausdruck.
foo();

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“…

Code kopieren Der Code lautet wie folgt:

void-Funktion () {
//Hier ist der Code, den Sie wirklich brauchen
}();

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:

Code kopieren Der Code lautet wie folgt:

Void-Funktion (global) {
//Hier ist global das globale Objekt
}(this) // Im Browser ist dies das Fensterobjekt

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn