Was ist der Zweck von einem selbst ausgeführten Funktion in javascript?
In javascript, wenn Sie wollen, verwenden Sie diese:
(function(){
//Bunch of code...
})();
über diese:
//Bunch of code...
Auch einen Blick auf ein (technischer) Erläuterung und hier. Für die syntax finden Sie unter warum die Klammern sind nötig und wo Sie gehen sollten.
Siehe auch Was ist der Zweck der Umhüllung ganzen Javascript-Dateien in anonymen Funktionen?
Warum müssen es die beiden letzten Klammern, nur vor dem Semikolon?
der Teil vor den letzten beiden Klammern deklarieren Sie eine (anonyme) Funktion. Diese beiden Klammern die Funktion aufrufen.
"Sofort Aufgerufen Function Expression" oder IIFE ist ein besserer name für diese.
Siehe auch Was ist der Zweck der Umhüllung ganzen Javascript-Dateien in anonymen Funktionen?
Warum müssen es die beiden letzten Klammern, nur vor dem Semikolon?
der Teil vor den letzten beiden Klammern deklarieren Sie eine (anonyme) Funktion. Diese beiden Klammern die Funktion aufrufen.
"Sofort Aufgerufen Function Expression" oder IIFE ist ein besserer name für diese.
InformationsquelleAutor Ej. | 2009-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seine ganze variable scoping. Variablen, die in die selbst ausgeführte Funktion sind standardmäßig nur für code innerhalb des selbst ausgeführte Funktion. Diese kann code geschrieben werden, ohne Sorge, wie die Variablen benannt sind, die in andere Blöcke von javascript-code.
Beispiel:
Wird diese erste Warnung "3" und dann einen Fehler auslösen, auf die nächste Warnung, weil foo ist nicht definiert.
(function(){ var foo = 3; alert(foo); })(); alert(foo);
wird first alert "3" und dann einen Fehler auslösen, auf die nächste Warnung, weil foo ist nicht definiert.Und auch für das nutzen viele Leute aus, es gibt unter anderem eine ganze Menge Netflix-Ingenieure: ES IST NUR EINE FUNKTION. Es ist nicht an und für sich Vertreter einer Schließung. Manchmal auto-invokers werden in Verbindung mit Verschluss-relevante Szenarien zu tun nette Dinge, aber wenn Sie nicht etwas sehen, halten Sie sich auf eine Referenz, würde der Müll abgeholt werden und Weg in eine nicht-Schließung Sprache, es hat nichts zu freaking tun, mit VERSCHLÜSSEN.
So bedeutet dies, Ihrer meist verwendet, mit Verschluss?
nicht ganz richtig... wenn man ohne
var
wie diese:...function(){ foo=3;}
? Es würde Globale variable, richtig?aber das passiert schon in lokalen Variablen innerhalb von Funktionen:
function(){ var foo = 3; alert(foo); }; alert(foo);
So habe ich noch nicht bekommenInformationsquelleAutor Ken Browning
Simpel. So ganz normal aussehende, seine fast tröstlich:
Jedoch. Was ist, wenn ich einen wirklich handlichen javascript-Bibliothek, um meine Seite übersetzt, moderne Charaktere in Ihrer Basis-Ebene Darstellungen?
Warten... was?
Ich meine. Wenn jemand Typen in ein Zeichen mit irgendeiner Art von Akzent (wie Französisch oder Spanisch, Charakter) aber ich will nur 'Englisch' - Zeichen? A-z in meinem Programm? Naja... Die Spanische 'n~' und Französisch 'e/' - Zeichen (ich habe jeweils zwei Zeichen für diese, aber Sie können wohl den geistigen Sprung in die Charakter, die für die Akzente), werden diese Zeichen übersetzt werden können in Basis-Zeichen 'n' und 'e'.
So jemand netten person geschrieben hat, eine umfassende Charakter-Konverter gibt, kann ich für meine Website... ich include es.
Ein problem: es hat eine Funktion namens 'name' dasselbe wie meine Funktion.
Dies nennt man Kollision. Wir haben noch zwei Funktionen deklariert, die in der gleichen Umfang mit dem gleichen Namen. Wir wollen dies vermeiden.
Also müssen wir Rahmen unserer code irgendwie.
Nur so Umfang-code in javascript ist, um wickeln Sie es in eine Funktion:
Könnte unser problem zu lösen. Alles ist nun geschlossen und kann nur zugegriffen werden, die innerhalb unseres öffnung und schließende Klammern.
Haben wir eine Funktion in einer Funktion... das ist komisch anzusehen, aber völlig legal.
Nur ein problem. Unser code funktioniert nicht.
Unsere variable "userName" ist nie hallten in der Konsole!
Können wir lösen dieses Problem, indem ein Aufruf an unsere Funktion nach unseren bestehenden code zu sperren...
Oder vor!
Sekundäre Sorge: Was sind die Chancen, dass der name "main" noch nicht verwendet wurden? ...also sehr, sehr schlank.
Brauchen wir MEHR scoping. Und eine Möglichkeit, um die automatische Ausführung unserer main () - Funktion.
Kommen wir nun zur auto-execution-Funktionen (oder selbst ausführen, selbst ausführen, was auch immer).
((){})();
Die syntax ist umständlich wie die Sünde. Jedoch, es funktioniert.
Wenn Sie wickeln die definition einer Funktion in Klammern und enthalten eine Parameterliste (ein anderer Satz oder Klammern!) es fungiert als eine Funktion nennen.
So lässt Blick auf unser code wieder, mit einigen self-executing-syntax:
So, in den meisten tutorials, die Sie Lesen, werden Sie nun bombardieren mit dem Begriff "anonymous self-executing" oder etwas ähnliches.
Nach vielen Jahren der beruflichen Entwicklung, ich stark fordere Sie auf, Namen jede Funktion, die Sie schreiben für debugging-Zwecke.
Wenn etwas schief geht (und das wird es), werden Sie die überprüfung der backtrace in Ihren browser. Es ist immer leichter eingrenzen-code Fragen, wenn die Einträge in der stack-trace haben Namen!
Enorm langatmig und ich hoffe, es hilft!
Vielen Dank für die Zeit nehmen, dies zu erklären, so gut.
Nette Antwort. Ich habe eine Frage zu deinem letzten Punkt, obwohl - Wenn Sie empfehlen, dass alle Funktionen benannt werden, werden Sie sagen, es gibt einen Weg, das zu tun, mit self-executing-Funktionen, oder was darauf hindeutet, dass jeder name der Funktion, dann nennen Sie es? EDIT Oh, ich sehe. Dieser ist bereits benannt. Duh. Vielleicht möchten Sie darauf hinweisen, dass Sie zur Rechtfertigung Ihrer Verwendung des benannten self-executing-Funktion.
Gut, mein Freund, das ist die Antwort, DIE ich suchte
:)
Super Antwort, sehr geschätzt.
InformationsquelleAutor Sean Holden
Ich bin ein großer fan 🙂 weil:
Enorm – (Warum sollten Sie sagen, Ihre guten?)
Mehr hier.
Sieben Jahre zu spät, aber für Punkt 1. es reduziert nicht die Codes an alle, in der Tat ist es fügt ein minimum von zwei Zeilen code in die Funktion erstellen.
nur der Punkt ist hier, "Es stellt einen Verschluss, die verhindert, dass Namenskonflikte" jeder andere Punkt ist der Wortlaut dieses oder falsch ist. vielleicht können Sie vereinfachen Ihre Antwort?
InformationsquelleAutor M A Hossain Tonu
Verwendung von Namensräumen. JavaScript-Bereiche werden Funktion-Ebene.
downvotes sind noch immer kommen, weil ich Namensräume instad von bereichsdefinition; dies ist eine Frage der definition - siehe z.B. Wikipedia: Ein namespace in computer science (manchmal auch genannt, ein name, Umfang), ist eine abstrakte container oder Umgebung erstellt zu halten, ist eine logische Gruppierung von eindeutigen Identifikatoren oder Symbole (D. H., den Namen). und Ein namespace-Bezeichner kann zum Kontext (Anwendungsbereich informatik), um den Namen und die Begriffe werden manchmal austauschbar verwendet.
Javascript function-level-Bereiche bieten den Raum, dass Variablennamen Leben in ein namespace;, dass es eine anonyme einer, die nicht in Zusammenhang mit einem Namensraum-Bezeichner ist irrelevant...
InformationsquelleAutor Christoph
Ich kann nicht glauben, dass keine der Antworten erwähnen, stillschweigend globals.
Den
(function(){})()
bauen schützt nicht vor impliziten Annahmen, was für mich die größere Bedeutung, siehe http://yuiblog.com/blog/2006/06/01/global-domination/Grundsätzlich die Funktion block stellt sicher, dass alle abhängigen "global vars" Sie definiert sind, beschränken sich auf Ihr Programm, es schützt Sie nicht gegen die Definition der impliziten Annahmen. JSHint oder wie können Empfehlungen auf, wie verteidigen Sie sich gegen dieses Verhalten.
Je präziser
var App = {}
syntax bietet ein ähnliches Maß an Schutz, und kann gewickelt werden, die in der Funktion sperren wenn Sie auf "öffentlichen" Seiten. (siehe Ember.js oder SproutCore der realen Welt Beispiele von Bibliotheken, die diese Anweisung verwenden)Soweit
private
Eigenschaften gehen, Sie sind irgendwie überbewertet, es sei denn, Sie erstellen eine öffentliche framework oder die Bibliothek, aber wenn Sie brauchen, um Sie umzusetzen, Douglas Crockford hat einige gute Ideen.InformationsquelleAutor David W. Keith
Gibt es einen parameter und die "Haufen code" gibt eine Funktion?
Schließung. Der Wert von
something
wird durch die Funktion zugeordneta
.something
haben könnte unterschiedlichem Wert (for-Schleife) und jedes mal, wenn ein hat eine neue Funktion.var x = something;
in der äußeren Funktion überx
als parameter, obwohl: imo ist es besser lesbar so...Wenn der Wert von "etwas" ändert sich nach der Funktion erzeugt wird, dann wird es mit dem neuen Wert und nicht derjenige, der zum Zeitpunkt seiner Erstellung.
wo hast du das denn her? Soweit ich weiß, das ist nicht der Fall; der einzige Weg, um wirkliche Referenzen in JS ist die Verwendung des arguments-Objekt, aber selbst das funktioniert nicht in allen Browsern
Die Guten Teile", Douglas Crockford (O ' Reilly)
ist es nicht so funktionieren, wie du es beschreibst: der neue Wert wird verwendet, wenn Sie drop die variable
x
und sind direkt abhängig von der lexikalischen Umfang, dhdocument.write(something)
...InformationsquelleAutor stesch
Umfang isolation, vielleicht. So, dass die Variablen innerhalb der Funktion Erklärung verschmutzen nicht die Umwelt, die äußeren namespace.
Natürlich, auf die Hälfte der JS-Implementierungen gibt, werden Sie sowieso.
Eine Umsetzung nicht geschrieben im strikten Modus und mit und implizite var-Deklaration, die bewirkt, dass es global.
InformationsquelleAutor chaos
Hier ist ein solides Beispiel dafür, wie eine self Berufung auf anonyme Funktion nützlich sein könnte.
Ausgabe:
10, 10, 10, 10, 10...
Ausgabe:
0, 1, 2, 3, 4...
Mit
let
statt dervar
ersten Fall wird in Ordnung sein.InformationsquelleAutor sg.cc
Einzige Unterschied ist, dass die Variablen, deklarieren Sie in der Funktion sind lokal, also Sie geht Weg, wenn Sie die Funktion beenden und die nicht im Konflikt mit anderen Variablen in anderen code.
InformationsquelleAutor Guffa
Ich gelesen habe, alle Antworten, etwas sehr wichtiges fehlt hier, ich werde KÜSSEN. Es gibt 2 Hauptgründe, warum ich brauche selbstausführende, Anonyme Funktionen, oder besser gesagt "Sofort-Invoked Function Expression (IIFE)":
Die erste wurde sehr gut erklärt. Für die zweite, studieren Sie bitte folgende Beispiel:
Achtung 1: Wir sind nicht die Zuordnung einer Funktion zu
MyClosureObject
weiter mehr das Ergebnis des Aufrufs der Funktion. Bewusst sein()
in der letzten Zeile.Achtung 2: Was tun, müssen Sie zusätzlich das wissen über Funktionen in Javascript ist, dass die inneren Funktionen Zugriff auf die Parameter und Variablen der Funktionen, die Sie definiert, innerhalb.
Lassen Sie uns versuchen, einige Experimente:
Bekomme ich
MyName
mitgetMyName
- und es funktioniert:Folgende naive Ansatz würde nicht funktionieren:
Aber ich kann einen anderen Namen und bekommen das erwartete Ergebnis:
Edit: Im obigen Beispiel
MyClosureObject
ist entworfen, um verwendet werden, ohne dienew
Präfix, also durch Konvention, es sollte nicht groß geschrieben werden.InformationsquelleAutor Lonely
Selbst aufgerufen wird die Funktion in javascript:
Einem selbst-Aufruf-Ausdrucks aufgerufen (gestartet) werden automatisch, ohne genannt zu werden. Ein selbst-Aufruf-Ausdruck aufgerufen wird, direkt nach seiner erstellt. Dies ist im Grunde verwendet, zur Vermeidung der Konflikte sowie für die Erreichung der Kapselung. Die Variablen und Objekte deklariert werden, die nicht von außen zugänglich diese Funktion. Für die Vermeidung der Probleme der Minimierung(mit dem Namen.min) verwenden Sie immer selbst ausgeführte Funktion.
InformationsquelleAutor Kishor Vitekar
Da Funktionen in Javascript sind erste-Klasse-Objekt definieren, dass es der Weg ist, ist es effektiv definiert eine "Klasse" ähnlich wie C++ oder C#.
Funktion definieren, lokale Variablen und Funktionen, die innerhalb es. Die internen Funktionen (effektiv Instanz-Methoden) haben Zugriff auf die lokalen Variablen (effektiv Instanz-Variablen), aber Sie wird isoliert vom rest des Skripts.
InformationsquelleAutor James Curran
Selbst ausgeführte Funktion zum verwalten der Gültigkeitsbereich einer Variablen.
Den Gültigkeitsbereich einer Variablen ist der Bereich Ihres Programms, in dem es definiert ist.
Eine Globale variable hat Globale Reichweite; es ist überall definiert im JavaScript-code und zugegriffen werden kann von überall aus dem Skript, auch in Ihren Funktionen. Auf der anderen Seite, Variablen, die innerhalb einer Funktion definiert sind, nur innerhalb des Körpers der Funktion an.
Sie sind lokale Variablen, haben einen lokalen Gültigkeitsbereich und kann nur zugegriffen werden, die innerhalb der Funktion. Parameter der Funktion zählen ebenfalls als lokale Variablen und definiert nur innerhalb des Körpers der Funktion an.
Wie unten dargestellt, können Sie den Zugriff auf die globalvariable variable innerhalb der Funktion und auch der Hinweis, dass im Körper einer Funktion eine lokale variable Vorrang vor einer globalen Variablen mit dem gleichen Namen.
Also im Grunde eine selbst ausgeführte Funktion kann code geschrieben werden, ohne Sorge, wie die Variablen benannt sind, die in andere Blöcke von javascript-code.
InformationsquelleAutor Adeojo Emmanuel IMM
Sieht es aus wie diese Frage beantwortet wurde alles fertig, aber ich poste meine Ideen sowieso.
Weiß ich, wenn ich wie zu verwenden self-executing-Funktionen.
Die Funktion erlaubt mir, auf einige extra-code zu definieren, der childObjects Attribute und Eigenschaften für saubereren code, wie das festlegen von Häufig verwendeten Variablen oder die Ausführung von mathematischen Gleichungen; Oh! oder Fehler überprüfen. im Gegensatz zu begrenzt, um verschachtelte Objekt-Instanziierung syntax...
Codierung im Allgemeinen hat eine Menge von obskuren Weise eine Menge von der gleichen Dinge, so dass Sie sich Fragen, "Warum die Mühe?" Aber neue Situationen, die immer wieder auftauchen, wo Sie nicht mehr darauf verlassen, basic/core principals allein.
InformationsquelleAutor Garrett
Tatsächlich, die oben genannten Funktion wird so behandelt, als Funktion Ausdruck ohne Namen.
Der Hauptzweck der Verpackung eine Funktion mit schließen und öffnen der Klammer zu vermeiden, die Verschmutzung des globalen Raums.
Variablen und Funktionen innerhalb der Funktion Ausdruck wurde private (ich.e) Sie werden nicht außerhalb der Funktion.
InformationsquelleAutor Madhankumar
IIRC es ermöglicht Ihnen das erstellen von privaten Eigenschaften und Methoden.
InformationsquelleAutor Ólafur Waage