Was ist der Zweck einer selbstausführenden Funktion in Javascript?
In javascript, wenn Sie wollen, verwenden Sie diese:
(function(){
//Bunch of code...
})();
über diese:
//Bunch of code...
InformationsquelleAutor der Frage 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.
InformationsquelleAutor der Antwort 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!
InformationsquelleAutor der Antwort Sean Holden
Ich bin ein großer fan 🙂 weil:
Enorm – (Warum sollten Sie sagen, Ihre guten?)
Mehr hier.
InformationsquelleAutor der Antwort M A Hossain Tonu
Verwendung von Namensräumen. JavaScript-Bereiche werden Funktion-Ebene.
InformationsquelleAutor der Antwort 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 der Antwort 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.InformationsquelleAutor der Antwort 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.
InformationsquelleAutor der Antwort 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...
InformationsquelleAutor der Antwort 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 der Antwort Guffa
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 der Antwort Kishor Vitekar
Ich gelesen habe, alle Antworten, etwas sehr wichtiges fehlt hierich 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 der Antwort Lonely
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 der Antwort James Curran
(function(){
var foo = {
name: 'bob'
};
console.log(foo.name); //bob
})();
console.log(foo.name); //Reference error
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 der Antwort Madhankumar
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 der Antwort 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 der Antwort Garrett
IIRC es ermöglicht Ihnen das erstellen von privaten Eigenschaften und Methoden.
InformationsquelleAutor der Antwort Ólafur Waage