Früher wusste ich, was das bedeutet, aber jetzt kämpfe ich ...
Sagt das im Grunde document.onload
?
(function () {
})();
javascript
iife
Exitos
quelle
quelle
Antworten:
Es ist ein sofort aufgerufener Funktionsausdruck , kurz IIFE . Es wird sofort ausgeführt, nachdem es erstellt wurde.
Es hat nichts mit einem Event-Handler für Events (wie
document.onload
) zu tun .Betrachten Sie den Teil im ersten Klammerpaar: .... es ist ein regulärer Funktionsausdruck. Schauen Sie sich dann das letzte Paar an . Dieses wird normalerweise einem Ausdruck hinzugefügt, um eine Funktion aufzurufen. in diesem Fall unser vorheriger Ausdruck.
(function(){})();
(function(){})();
Dieses Muster wird häufig verwendet, um eine Verschmutzung des globalen Namespace zu vermeiden, da alle im IIFE verwendeten Variablen (wie bei jeder anderen normalen Funktion) außerhalb des Gültigkeitsbereichs nicht sichtbar sind.
Aus diesem Grund haben Sie diese Konstruktion möglicherweise mit einem Event-Handler verwechselt
window.onload
, weil sie häufig wie folgt verwendet wird:Von Guffa vorgeschlagene Korrektur :
Update Da dies ein ziemlich beliebtes Thema, es ist erwähnenswert , dass IIFE der kann auch mit geschrieben werden ES6 des Pfeil - Funktion (wie Gajus hat darauf hingewiesen , in einem Kommentar ):
quelle
function(){ var foo = '5'; }
Es ist nur eine anonyme Funktion, die direkt nach ihrer Erstellung ausgeführt wird.
Es ist so, als hätten Sie es einer Variablen zugewiesen und direkt danach verwendet, nur ohne die Variable:
In jQuery gibt es ein ähnliches Konstrukt, an das Sie vielleicht denken:
Das ist die Kurzform der Bindung des
ready
Ereignisses:Die obigen zwei Konstrukte sind jedoch keine IIFE .
quelle
Ein sofort aufgerufener Funktionsausdruck (IIFE) ruft sofort eine Funktion auf. Dies bedeutet einfach, dass die Funktion unmittelbar nach Abschluss der Definition ausgeführt wird.
Drei weitere gebräuchliche Formulierungen:
Wenn es keine besonderen Anforderungen für den Rückgabewert gibt, können wir schreiben:
Alternativ kann es sein:
Sie können sogar schreiben:
quelle
31.new
'ist ungültige Syntax;(function(){}());
1 - 1
und Sie können genauso einfach tuntrue - function(){}
. Es ist nur eine Sache (ein Infix-Subtraktionsoperator), aber mit unterschiedlichen, sogar unsinnigen Operanden.Es deklariert eine anonyme Funktion und ruft sie dann auf:
quelle
arguments
ist etwas Besonderes ; Ich vermute, der Antwortende hat gerade umgedreht, wohin die Namen gehenDas heißt sofort ausführen.
Also, wenn ich das tue:
Geige: http://jsfiddle.net/maniator/LqvpQ/
Zweites Beispiel:
quelle
Dieses Konstrukt wird als sofort aufgerufener Funktionsausdruck (IIFE) bezeichnet, was bedeutet, dass es sofort ausgeführt wird. Stellen Sie sich das als eine Funktion vor, die automatisch aufgerufen wird, wenn der Interpreter diese Funktion erreicht.
Häufigster Anwendungsfall:
Einer der häufigsten Anwendungsfälle besteht darin, den Umfang einer über erstellten Variablen zu begrenzen
var
. Variablen erstellt übervar
haben einen auf eine Funktion beschränkten Bereich, sodass dieses Konstrukt (das ein Funktionsumbruch um bestimmten Code ist) sicherstellt, dass Ihr Variablenbereich nicht aus dieser Funktion herausläuft.Im folgenden Beispiel ist
count
außerhalb der sofort aufgerufenen Funktion nicht verfügbar, dh der Umfang voncount
wird nicht aus der Funktion austreten. Sie sollten eine bekommenReferenceError
, sollten Sie trotzdem versuchen, außerhalb der sofort aufgerufenen Funktion darauf zuzugreifen.ES6 Alternative (empfohlen)
In ES6 können jetzt Variablen über
let
und erstellt werdenconst
. Beide haben einen Blockbereich (im Gegensatz zu einemvar
Funktionsbereich).Anstatt dieses komplexe Konstrukt von IIFE für den oben erwähnten Anwendungsfall zu verwenden, können Sie jetzt viel einfacheren Code schreiben, um sicherzustellen, dass der Gültigkeitsbereich einer Variablen nicht aus Ihrem gewünschten Block herausläuft.
In diesem Beispiel haben wir
let
einecount
Variable definiert , die sichcount
auf den Codeblock beschränkt, den wir mit den geschweiften Klammern erstellt haben{...}
.Ich nenne es ein "Curly Jail".
quelle
Dies wird als IIFE (Sofort aufgerufener Funktionsausdruck) bezeichnet. Als eines der bekanntesten JavaScript-Designmuster ist es das Herz und die Seele des modernen Modulmusters. Wie der Name schon sagt, wird es sofort ausgeführt, nachdem es erstellt wurde. Dieses Muster erstellt einen isolierten oder privaten Ausführungsbereich.
JavaScript vor ECMAScript 6 verwendete lexikalisches Scoping, daher wurde IIFE zur Simulation des Block-Scoping verwendet. (Mit ECMAScript 6 ist das Block-Scoping mit der Einführung der Schlüsselwörter
let
und möglichconst
.) Referenz für Probleme mit dem lexikalischen ScopingSimulieren Sie das Block-Scoping mit IIFE
Der Leistungsvorteil IIFE ist die Verwendung ist die Möglichkeit , häufig verwendete globale Objekte zu übergeben , wie
window
,document
etc. als Argument durch den Umfang Nachschlag zu reduzieren. (Denken Sie daran, dass JavaScript nach Eigenschaften im lokalen Bereich sucht und die Kette bis zum globalen Bereich hochfährt.) Der Zugriff auf globale Objekte im lokalen Bereich reduziert die Suchzeit wie unten beschrieben.quelle
Nein, dieses Konstrukt erstellt nur einen Bereich für die Benennung. Wenn Sie es in Teile zerbrechen, können Sie sehen, dass Sie eine externe haben
Das ist ein Funktionsaufruf. In der Klammer haben Sie:
Das ist eine anonyme Funktion. Alles, was innerhalb des Konstrukts mit var deklariert wird, ist nur innerhalb desselben Konstrukts sichtbar und verschmutzt den globalen Namespace nicht.
quelle
Dies ist ein sofort aufgerufener Funktionsausdruck in Javascript:
Um IIFE in JS zu verstehen, lassen Sie es uns zusammenfassen:
Beispiel: Probieren Sie Folgendes in der Chrome-Konsole aus. Dies sind Ausdrücke in JS.
Beispiel:
Funktionsweise des Funktionsausdrucks:
- Wenn die JS-Engine zum ersten Mal ausgeführt wird (Ausführungskontext - Erstellungsphase), wird diese Funktion (rechts von = oben) nicht ausgeführt oder im Speicher gespeichert. Der Variablen 'greet' wird von der JS-Engine der Wert 'undefined' zugewiesen.
- Während der Ausführung (Ausführungskontext - Ausführungsphase) wird das Funktionsobjekt im laufenden Betrieb erstellt (es wird noch nicht ausgeführt ), der Variablen 'greet' zugewiesen und kann mit 'greet (' somename ')' aufgerufen werden.
3. Sofort aufgerufener Funktionsausdruck:
Beispiel:
So funktioniert IIFE :
- Beachten Sie das '()' unmittelbar nach der Funktionsdeklaration. Jedem Funktionsobjekt ist eine 'CODE'-Eigenschaft zugeordnet, die aufgerufen werden kann. Und wir können es mit '()' Klammern aufrufen (oder aufrufen).
- Hier wird also während der Ausführung (Ausführungskontext - Ausführungsphase) das Funktionsobjekt erstellt und gleichzeitig ausgeführt - Jetzt hat die Begrüßungsvariable anstelle des Funktionsobjekts ihren Rückgabewert (eine Zeichenfolge).
Typischer Anwendungsfall von IIFE in JS:
Das folgende IIFE-Muster wird ziemlich häufig verwendet.
b) Wir rufen diese Funktion gleichzeitig mit () am Ende auf.
Diese Funktion wird also gleichzeitig erstellt und ausgeführt (IIFE).
Wichtiger Anwendungsfall für IIFE:
IIFE schützt unseren Code.
- Als Funktion hat IIFE einen eigenen Ausführungskontext, dh alle darin erstellten Variablen sind lokal für diese Funktion und werden nicht mit dem globalen Ausführungskontext geteilt.
Angenommen, ich habe eine andere JS-Datei (test1.js), die in meiner Anwendung zusammen mit iife.js verwendet wird (siehe unten).
IIFE hilft uns also dabei , sicheren Code schreiben, bei dem wir nicht unbeabsichtigt mit den globalen Objekten kollidieren.
quelle
Das ist eine selbstaufrufende anonyme Funktion .
Lesen Sie die W3Schools-Erklärung einer selbstaufrufenden Funktion .
quelle
(function named(){console.log("Hello");}());
<- selbstausführende benannte FunktionDies ist die selbst aufrufende anonyme Funktion. Es wird ausgeführt, während es definiert ist. Dies bedeutet, dass diese Funktion definiert ist und sich unmittelbar nach der Definition aufruft.
Und die Erklärung der Syntax lautet: Die Funktion in der ersten
()
Klammer ist die Funktion, die keinen Namen hat, und in der nächsten();
Klammer können Sie verstehen, dass sie zum Zeitpunkt der Definition aufgerufen wird. Und Sie können jedes Argument in dieser zweiten()
Klammer übergeben, das in der Funktion in der ersten Klammer erfasst wird. Siehe dieses Beispiel:Hier ist das 'Objekt', das Sie übergeben, innerhalb der Funktion durch 'obj' zugänglich, da Sie es in der Funktionssignatur erfassen.
quelle
Fang hier an:
Setzen Sie es in eine Funktion ein und es ist nicht mehr global - Ihr primäres Ziel.
Rufen Sie die Funktion sofort auf - oops:
Verwenden Sie die Klammern, um einen Syntaxfehler zu vermeiden:
Sie können den Funktionsnamen weglassen:
Komplizierter muss es nicht sein.
quelle
Uncaught SyntaxError: Unexpected token )
eher erwähnt als erwähnt. Könnten Sie möglicherweise eine Geige damit teilen, die den Pfeilfunktionsfehler auslöst?Selbstausführende anonyme Funktion. Es wird ausgeführt, sobald es erstellt wurde.
Ein kurzes und dummes Beispiel, bei dem dies nützlich ist, ist:
Anstatt jedes Mal eine Liste zu erstellen, erstellen Sie sie nur einmal (weniger Overhead).
quelle
Selbstausführende Funktionen werden normalerweise verwendet, um den Kontext zu kapseln und Namenskollusionen zu vermeiden. Alle Variablen, die Sie in (function () {..}) () definieren, sind nicht global.
Der Code
erzeugt diese Ausgabe:
Mit dieser Syntax vermeiden Sie Kollisionen mit globalen Variablen, die an anderer Stelle in Ihrem JavaScript-Code deklariert sind.
quelle
var same_name = 1; var myVar = function() { var same_name = 2; console.log(same_name); }; myVar(); console.log(same_name);
Hätte das gleiche Ergebnis.Es heißt IIFE - Sofort aufgerufener Funktionsausdruck. Hier ist ein Beispiel, um die Syntax und Verwendung zu zeigen. Es wird verwendet, um die Verwendung von Variablen nur bis zur Funktion und nicht darüber hinaus zu erfassen.
quelle
IIFE (Sofort aufgerufener Funktionsausdruck) ist eine Funktion, die ausgeführt wird, sobald das Skript geladen wird und verschwindet.
Betrachten Sie die folgende Funktion, die in einer Datei mit dem Namen iife.js geschrieben ist
Dieser obige Code wird ausgeführt, sobald Sie iife.js laden und ' Hello Stackoverflow! auf der Konsole der Entwicklertools.
Eine ausführliche Erläuterung finden Sie unter Sofort aufgerufener Funktionsausdruck (IIFE).
quelle
Ein weiterer Anwendungsfall ist die Memoisierung, bei der ein Cache-Objekt nicht global ist:
quelle
Eine
IIFE
kann auch als selbstaufrufende anonyme Funktion beschrieben werden. Am häufigsten wird der Umfang einer über var erstellten Variablen begrenzt oder der Kontext gekapselt, um Namenskollisionen zu vermeiden.quelle
Der Grund, warum selbstaufrufende anonyme Funktionen verwendet werden, ist, dass sie niemals von einem anderen Code aufgerufen werden sollten, da sie den Code "einrichten", der aufgerufen werden soll (zusammen mit dem Geben von Funktionen und Variablen).
Mit anderen Worten, sie sind wie Programme, die zu Beginn des Programms "Klassen erstellen". Nachdem sie (automatisch) instanziiert wurden, sind nur die Funktionen verfügbar, die von der anonymen Funktion zurückgegeben werden. versteckte Funktionen sind noch vorhanden, zusammen mit jedem Status (Variablen, die während der Bereichserstellung festgelegt wurden).
Sehr cool.
quelle
Der folgende Code:
wird als sofort aufgerufener Funktionsausdruck bezeichnet (IIFE) bezeichnet.
Es wird als Funktionsausdruck bezeichnet, da der
( yourcode )
Operator in Javascript ihn in einen Ausdruck zwingt. Der Unterschied zwischen einem Funktionsausdruck und einer Funktionsdeklaration ist folgender:Ein Ausdruck ist einfach eine Menge Code, der zu einem einzelnen Wert ausgewertet werden kann . Bei den Ausdrücken im obigen Beispiel war dieser Wert ein einzelnes Funktionsobjekt .
Nachdem wir einen Ausdruck haben, der zu einem Funktionsobjekt ausgewertet wird, können wir das Funktionsobjekt sofort mit dem Operator aufrufen
()
. Zum Beispiel:Warum ist das nützlich?
Wenn es sich um eine große Codebasis handelt und / oder wenn wir verschiedene Bibliotheken importieren, steigt die Wahrscheinlichkeit von Namenskonflikten. Wenn wir bestimmte Teile unseres Codes schreiben, die in einem IIFE verwandt sind (und daher dieselben Variablen verwenden), werden alle Variablen und Funktionsnamen in die Funktionsklammern des IIFE aufgenommen . Dies verringert die Wahrscheinlichkeit von Namenskonflikten und ermöglicht es Ihnen, sie nachlässiger zu benennen (z. B. müssen Sie ihnen kein Präfix voranstellen).
quelle
In der ES6-Syntax (für mich selbst posten, da ich immer wieder auf dieser Seite lande und nach einem kurzen Beispiel suche):
quelle
Diese Funktion wird als selbstaufrufende Funktion bezeichnet. Eine selbstaufrufende (auch selbstausführende) Funktion ist eine namenlose (anonyme) Funktion, die unmittelbar nach ihrer Definition aufgerufen (aufgerufen) wird. Lesen Sie hier mehr
Diese Funktionen bewirken, dass bei der Definition der Funktion die Funktion sofort aufgerufen wird, was Zeit und zusätzliche Codezeilen spart (im Vergleich zum Aufrufen in einer separaten Zeile).
Hier ist ein Beispiel:
quelle
Dies ist eine ausführlichere Erklärung, warum Sie dies verwenden würden:
"Der Hauptgrund für die Verwendung eines IIFE ist der Erhalt des Datenschutzes. Da die var-Variablen von JavaScript auf ihre enthaltende Funktion beschränkt sind, kann die Außenwelt nicht auf Variablen zugreifen, die innerhalb des IIFE deklariert sind."
http://adripofjavascript.com/blog/drips/an-introduction-to-iffes-immedially-invoked-function-expressions.html
quelle
Es ist ein Funktionsausdruck und steht für sofort aufgerufenen Funktionsausdruck (IIFE). IIFE ist einfach eine Funktion, die direkt nach ihrer Erstellung ausgeführt wird. Nachdem die Funktion warten muss, bis sie zur Ausführung aufgerufen wird, wird IIFE sofort ausgeführt. Lassen Sie uns das IIFE anhand eines Beispiels konstruieren. Angenommen, wir haben eine Add-Funktion, die zwei Ganzzahlen als Argumente verwendet und die Summe zurückgibt. Lassen Sie uns die Add-Funktion in ein IIFE verwandeln.
Schritt 1: Definieren Sie die Funktion
Schritt 2: Rufen Sie die Funktion auf, indem Sie die gesamte Funktionsdeklaration in Klammern setzen
Schritt 3: Um die Funktion sofort aufzurufen, entfernen Sie einfach den 'Hinzufügen'-Text aus dem Aufruf.
Der Hauptgrund für die Verwendung eines IFFE besteht darin, einen privaten Bereich innerhalb Ihrer Funktion beizubehalten. In Ihrem Javascript-Code möchten Sie sicherstellen, dass Sie keine globale Variable überschreiben. Manchmal definieren Sie versehentlich eine Variable, die eine globale Variable überschreibt. Versuchen wir es mit einem Beispiel. Angenommen, wir haben eine HTML-Datei namens iffe.html und Codes innerhalb des Body-Tags sind:
Nun, der obige Code wird ohne jede Frage ausgeführt. Nehmen wir nun an, Sie haben versehentlich oder absichtlich eine Variable mit dem Namen document deklariert.
Sie werden in einem SyntaxError enden : Neudeklaration eines nicht konfigurierbaren globalen Eigenschaftendokuments.
Wenn Sie jedoch einen Variablennamen documet deklarieren möchten, können Sie dies mithilfe von IFFE tun.
Ausgabe:
Nehmen wir ein anderes Beispiel an. Nehmen wir an, wir haben ein Taschenrechnerobjekt wie unten.
Nun, es funktioniert wie ein Zauber. Was ist, wenn wir versehentlich den Wert des Taschenrechnerobjekts neu zuweisen?
Ja, Sie erhalten einen TypeError: calculator.mul ist keine Funktion iffe.html
Mit Hilfe von IFFE können wir jedoch einen privaten Bereich erstellen, in dem wir einen anderen Variablennamenrechner erstellen und verwenden können.
Ausgabe:
quelle
Ich denke, die 2 Sätze von Klammern machen es ein bisschen verwirrend, aber ich habe eine andere Verwendung im Google-Beispiel gesehen, sie haben etwas Ähnliches verwendet. Ich hoffe, dies wird Ihnen helfen, besser zu verstehen:
Wenn dies
windows.app
nicht definiert ist,window.app = {}
wird es sofort ausgeführt und daher während der Bedingungsbewertungwindow.app
zugewiesen.{}
Das Ergebnis ist also beidesapp
und wirdwindow.app
jetzt. Die{}
Konsolenausgabe lautet also:quelle
Normalerweise rufen wir eine Funktion nicht sofort auf, nachdem wir sie in das Programm geschrieben haben. In extrem einfachen Worten, wenn Sie eine Funktion direkt nach ihrer Erstellung aufrufen, heißt sie IIFE - ein ausgefallener Name.
quelle
Normalerweise hat JavaScript-Code einen globalen Gültigkeitsbereich in der Anwendung. Wenn wir darin eine globale Variable deklarieren, besteht die Möglichkeit, dass dieselbe doppelte Variable in einem anderen Bereich der Entwicklung für einen anderen Zweck verwendet wird. Aufgrund dieser Duplizierung kann ein Fehler auftreten. Damit wir diese globalen Variablen vermeiden können, indem wir den Funktionsausdruck sofort aufrufen, ist dieser Ausdruck ein selbstausführender Ausdruck. Wenn wir unseren Code in diesem IIFE erstellen Ausdruck , entspricht die globale Variable dem lokalen Bereich und der lokalen Variablen.
Zwei Möglichkeiten, wie wir IIFE erstellen können
ODER
Im obigen Code-Snippet ist " var app " jetzt eine lokale Variable.
quelle