Warum müssen Sie eine anonyme Funktion in derselben Zeile aufrufen?
Las ich einige Beiträge über Schließungen und sah überall, aber es gibt keine klare Erklärung, wie es funktioniert - jedes mal wenn ich gerade gesagt, es zu benutzen...:
//Create a new anonymous function, to use as a wrapper
(function(){
//The variable that would, normally, be global
var msg = "Thanks for visiting!";
//Binding a new function to a global object
window.onunload = function(){
//Which uses the 'hidden' variable
alert( msg );
};
//Close off the anonymous function and execute it
})();
Ok, ich sehe, dass wir neue anonyme Funktion und führen Sie es. So nach, dass dieser einfache code sollte funktionieren (und tut es):
(function (msg){alert(msg)})('SO');
Meine Frage ist, welche Art von Magie ist hier passiert? Ich dachte, dass, wenn ich schrieb:
(function (msg){alert(msg)})
dann eine neue Unbenannte Funktion, die entstehen würden, wie die Funktion ""(msg) ...
dann aber, warum funktioniert das nicht?
(function (msg){alert(msg)});
('SO');
Wieso braucht es in der gleichen Zeile?
Könnten Sie bitte zeigen Sie mir einige Beiträge oder geben Sie mir eine Erklärung?
InformationsquelleAutor der Frage palig | 2009-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Drop das Semikolon nach der definition der Funktion.
Oben funktionieren sollte.
DEMO-Seite: https://jsfiddle.net/e7ooeq6m/
Ich haben besprochen, diese Art von Muster in diesem Beitrag:
jQuery und $ Fragen
EDIT:
Wenn man sich ECMA script Spezifikationes gibt 3 Möglichkeiten, können Sie eine Funktion definieren. (Seite 98, § 13 Definition Einer Funktion)
1. Mithilfe der Function-Konstruktor
2. Mit der Funktion Erklärung.
3. Funktion Ausdruck
So können Sie Fragen, was ist der Unterschied zwischen Erklärung und Ausdruck?
Von ECMA Script Spezifikation:
Wenn Sie bemerken, 'Bezeichner' ist optional für die Funktion Ausdruck. Und wenn Sie nicht geben Sie einen Bezeichner ein, erstellen Sie eine anonyme Funktion. Es bedeutet nicht, dass Sie können nicht geben Sie eine id ein.
Dies bedeutet, dass Folgendes gilt.
Wichtiger Punkt zu beachten ist, dass Sie können 'mySum', die nur innerhalb der Funktion mySum Körper, nicht außerhalb. Siehe Folgendes Beispiel:
Live-Demo
Vergleichen
Bewaffnet mit diesem wissen, lassen Sie uns versuchen zu analysieren, in Ihren code ein.
Wenn Sie code wie,
Erstellt man sich einen Funktionsausdruck. Und können Sie diese Funktion ausführen Ausdruck durch das einwickeln von es in Klammern.
InformationsquelleAutor der Antwort
Es ist als ein self-aufgerufene Funktion.
Was Sie tun, wenn Sie rufen
(function(){})
ist wieder ein function-Objekt. Wenn Sie append()
es aufgerufen wird, und alles, was im Körper ausgeführt wird. Die;
kennzeichnet das Ende der Anweisung, das ist der Grund, warum der 2. Aufruf scheitert.InformationsquelleAutor der Antwort seth
Eins fand ich verwirrend ist, dass die "()" Gruppierung von Operatoren.
Hier ist Ihre grundlegende Funktion deklariert.
Ex. 1:
Funktionen sind Objekte und können gruppiert werden. So let ' s werfen Sie Klammern um die Funktion.
Ex. 2:
Nun statt deklarieren und rechten Weg aufrufen der gleichen Funktion, die wir verwenden können basic-substitution zu erklären, wie wir es nennen.
Ex. 3.
Endlich, wir haben keinen Bedarf für eine zusätzliche foo, weil wir nicht mit den Namen zu nennen! Funktionen können anonym sein.
Ex. 4.
Ihre Frage zu beantworten, verweisen zurück zu Beispiel 2. Die erste Zeile erklärt einige namenlose Funktion und Gruppen, aber nicht nennen. In der zweiten Zeile die Gruppen a string. Beide tun nichts. (Vincent ' s erstes Beispiel.)
Aber
InformationsquelleAutor der Antwort Benxamin
Einer anonymen Funktion ist nicht eine Funktion mit der Bezeichnung "". Es ist einfach eine Funktion ohne Namen.
Wie jeder andere Wert in JavaScript ist eine Funktion nicht mit einem Namen erstellt werden. Obwohl es weit mehr nützlich, um tatsächlich binden es ein name wie jeder andere Wert.
Aber wie alle anderen Werte, die Sie manchmal wollen, um es zu verwenden, ohne Bindung an einen Namen. Das ist die selbst-Aufruf-Muster.
Hier ist eine Funktion und eine Zahl, nicht gebunden, tun Sie nichts, und kann nie verwendet werden:
Also müssen wir speichern Sie in einer Variablen in der Lage sein, Sie zu nutzen, genau wie jeder andere Wert:
Können Sie auch syntatic Zucker zu binden, die Funktion einer Variablen:
Aber wenn die Namensgebung ist nicht erforderlich und würde zu noch mehr Verwirrung und weniger die Lesbarkeit, Sie konnte einfach Sie sofort.
Hier, meine Funktion und meine zahlen sind nicht an eine variable, aber Sie können noch verwendet werden.
So gesagt, es sieht aus wie selbst-aufrufen der Funktion keinen echten Mehrwert. Aber Sie müssen im Hinterkopf behalten, dass JavaScript-Bereich Trennzeichen die Funktion und nicht den block ({}).
So ein selbst-aufrufen-Funktion hat eigentlich die gleiche Bedeutung wie ein C++ -, C# - oder Java-block. Das bedeutet, dass eine variable erstellt, im inneren nicht "Leck" außerhalb des Bereichs. Dies ist sehr nützlich in JavaScript, um sich nicht zu verunreinigen (global).
InformationsquelleAutor der Antwort Vincent Robert
Es ist nur, wie JavaScript funktioniert. Sie können erklären, eine benannte Funktion:
Und nennen es:
Oder Sie können die Deklaration einer anonymen Funktion:
Und nennen das:
Oder Sie können einfach nie binden der Funktion an einen Namen:
Funktionen können auch wieder Funktionen:
Ist es nichts Wert, dass alle Variablen mit "var" im Körper des
make_foo
wird geschlossen, indem jede Funktion zurückgegebenmake_foo
. Dies ist eine Schließung, und es bedeutet, dass jede änderung des Wertes durch eine Funktion sichtbar sein durch ein anderes.Diese können Sie Kapseln Informationen, wenn Sie es wünschen:
Es ist einfach wie fast jeder Programmiersprache, aber Java funktioniert.
InformationsquelleAutor der Antwort jrockway
Den code, den Sie zeigen,
bestehen aus zwei Aussagen. Der erste ist ein Ausdruck, ergibt sich ein function-Objekt (wird dann von der garbage Collection freigegeben, weil es wird nicht gespeichert). Der zweite ist ein Ausdruck ergibt einen string. Um die Funktion anwenden, um die Zeichenfolge, müssen Sie entweder die Zeichenfolge übergeben, die als argument an die Funktion, wenn es erstellt wird (was Sie auch Karte oben), oder müssen Sie tatsächlich speichern Sie die Funktion in einer variable, so dass Sie anwenden können, es zu einem späteren Zeitpunkt in Ihrer Freizeit. Etwa so:
Beachten Sie, dass durch die Speicherung eine anonyme Funktion (lambda-Funktionen) in einer Variablen, sind Sie effektiv geben Sie ihm einen Namen. Daher kann man genauso gut definieren einer regulären Funktion:
InformationsquelleAutor der Antwort Stephan202
In Zusammenfassung der bisherigen Kommentare:
wenn nicht einer Variablen zugewiesen wird, ergibt sich ein Syntaxfehler. Der code wird analysiert, wie eine function-Anweisung (bzw. die definition), was macht die schließenden Klammern syntaktisch falsch. Hinzufügen von Klammern um die Funktion Teil weist den interpreter (und der Programmierer), dass diese ist eine Funktion Ausdruck (oder Aufruf), wie in
Dies ist ein selbst-aufrufen der Funktion, was bedeutet, es ist anonym erstellt und wird sofort ausgeführt, da der Aufruf geschieht in der gleichen Zeile wo Sie deklariert ist. Dieser selbst-durch das aufrufen der Funktion angezeigt wird mit der syntax zum aufrufen einer nicht-argument-Funktion, plus zusätzlichen Klammern um den Namen der Funktion:
(myFunction)();
.Es ist eine gute Diskussion SO JavaScript-Funktion syntax.
InformationsquelleAutor der Antwort hotshot309
Diese Antwort ist streng genommen nicht mit der Frage, aber Sie könnten daran interessiert sein, zu erfahren, dass diese Art der syntax-Funktion ist nicht Funktionen. Zum Beispiel, wir können immer etwas tun, wie dieses:
Bezug auf Funktionen. Sie sind Objekte, die Erben von Funktion.der Prototyp, den wir tun können, Dinge wie:
Und Sie wissen, wir haben nicht einmal die surround-Funktionen mit Klammern, um Sie auszuführen. Jedenfalls, solange wir versuchen, weisen das Ergebnis einer Variablen zu.
Eine andere Sache, die Sie tun können, mit Funktionen, sobald Sie deklarieren, ist zum aufrufen der
new
Betreiber über Sie und erhalten Sie ein Objekt. Die folgenden sind äquivalent:InformationsquelleAutor der Antwort Ionuț G. Stan
Es ist eine weitere Eigenschaft von JavaScript Funktion hat. Wenn Sie möchten, rufen gleiche anonyme Funktion rekursiv.
InformationsquelleAutor der Antwort Anoop
Mein Verständnis der Fragesteller die Frage ist:
Wie funktioniert diese Magie zu arbeiten:
Ich kann mich auch irren. Jedoch, die übliche Praxis, dass Menschen, die vertraut sind mit:
Der Grund dafür ist, dass solche JavaScript-Klammern AKA
()
können keine Aussagen enthalten, und, wenn der parser auf das Schlüsselwort function, weiß, dass es zu analysieren, es als Funktion Ausdruck und nicht in einer Funktionsdeklaration.Quelle: blog post Sofort-Invoked Function Expression (IIFE)
InformationsquelleAutor der Antwort laycat
Beispiele ohne Klammern:
(dies ist die einzige wirkliche Verwendung von void, afaik)
oder
oder
Arbeit als gut. die
void
verursacht die expression zu evaluieren, sowie die Abtretung und den Knall. die Letzte mit der man arbeitet,~
+
-
delete
typeof
einige der unäre Operatoren (void
ist eines auch). nicht funktioniert sind natürlich++
--
aufgrund der Anforderung einer Variablen.dem Zeilenumbruch ist nicht erforderlich.
InformationsquelleAutor der Antwort Nina Scholz
Es ist eine self-executing anonymous function. Der erste Satz von Klammern enthalten die Ausdrücke ausgeführt werden, und der zweite Satz von Klammern führt die Ausdrücke.
Peter Michaux beschreibt den Unterschied in Ein Wichtiges Paar von Klammern.
Es ist ein nützliches Konstrukt, wenn Sie versuchen sich zu verstecken von Variablen aus der übergeordneten namespace. Den code in der Funktion enthalten ist, im privaten Rahmen die Funktion, was bedeutet, es kann nicht zugegriffen werden, an alle, die von außerhalb der Funktion, so dass es wirklich private.
Finden Sie unter:
InformationsquelleAutor der Antwort Ashwin Parmar
Einem anderen Blickwinkel
Erste Deklaration einer anonymen Funktion:
Dann rufen Sie es:
Weil foo = function(msg){alert(msg);} so können Sie ersetzen foo:
Aber sollten Sie wickeln Ihre gesamte anonyme Funktion innerhalb paar von Klammern zu vermeiden syntax-Fehler deklarieren-Funktion beim analysieren. Dann haben wir,
So, Es ist einfach zu verstehen für mich.
InformationsquelleAutor der Antwort capu
Wenn du hast:
Ihnen endete der Funktion vor
('SO')
weil das Semikolon. Wenn Sie nur schreiben:Wird es funktionieren.
Beispiel: http://jsfiddle.net/oliverni/dbVjg/
InformationsquelleAutor der Antwort Oliver Ni
Dem einfachen Grund, warum es nicht funktioniert, ist nicht wegen der
;
um das Ende der anonymen Funktion. Es ist, weil ohne die()
am Ende eine Funktion aufrufen, ist es nicht eine Funktion aufrufen. Das ist,Wenn Sie anrufen
result = help();
dies ist ein Aufruf einer Funktion und gibt true zurück.Wenn Sie anrufen
result = help;
dies ist kein Aufruf. Es ist eine Aufgabe, wo Hilfe behandelt wird, wie Daten zugewiesen werden, zur Folge.Was Sie Tat, war die Deklaration/Instanziierung einer anonymen Funktion durch hinzufügen des durch Semikolon,
und dann versucht zu rufen, es in eine weitere Aussage, die einfach mit den Klammern... Klar, weil die Funktion keinen Namen hat, aber das wird nicht funktionieren:
Der Dolmetscher sieht den Klammern in der zweiten Zeile als ein neues Anleitung/Anweisung, und damit funktioniert es nicht, selbst wenn Sie es Taten wie diese:
Es immer noch nicht funktioniert, aber es funktioniert, wenn Sie entfernen Sie das Semikolon, da der interpreter ignoriert Leerzeichen und Wagen und sieht der komplette code als ein statement.
Fazit: ein Funktionsaufruf ist nicht eine Funktion aufrufen, ohne die
()
auf das Ende es sei denn, unter bestimmten Bedingungen, wie aufgerufen wird, von einer anderen Funktion, das heißt onload='Hilfe' würde ausführen die Hilfe-Funktion, auch wenn die Klammern nicht enthalten waren. Ich glaube, setTimeout und setInterval auch erlauben, diese Art von Funktionsaufruf zu, und ich glaube auch, dass der Dolmetscher fügt die Klammern hinter die kulissen ohnehin die bringt uns zurück zu "ein Funktionsaufruf ist nicht ein Funktionsaufruf ohne Klammern".InformationsquelleAutor der Antwort hired techniques
Dies ist eine gängige Methode der Verwendung einer anonymen Funktion als Verschluss, die vielen JavaScript-frameworks verwenden.
Diese Funktion ist automatisch, wenn der code kompiliert wird.
Wenn Sie
;
bei der ersten Zeile, die der compiler behandelt Sie als zwei verschiedene Linien. So können Sie nicht die gleichen Ergebnisse wie oben.Kann dies auch geschrieben werden als:
Für mehr details, schauen Sie in JavaScript/Anonyme Funktionen.
InformationsquelleAutor der Antwort user2349539
Anonyme Funktionen sind Funktionen, die dynamisch deklariert
- Laufzeit. Sie nennen sich anonyme Funktionen, weil Sie nicht
einen Namen in der gleichen Weise wie normale Funktionen.
Anonyme Funktionen deklariert sind, verwenden Sie die Funktion operator statt
von der Deklaration der Funktion. Können Sie die Funktion Bediener
erstellen Sie eine neue Funktion, wo es gilt, einen Ausdruck. Für
Beispiel, könnten Sie deklarieren Sie eine neue Funktion, die als parameter ein
Funktion Aufruf oder zuweisen einer Eigenschaft zu einem Objekt.
Hier ist ein typisches Beispiel für eine benannte Funktion:
Funktion flyToTheMoon() { alert("Zoom! Zoom! Zoom!"); }
flyToTheMoon(); Hier ist das gleiche Beispiel erstellt, wie eine anonyme
Funktion:
var flyToTheMoon = function() { alert("Zoom! Zoom! Zoom!"); }
flyToTheMoon();
Für details Lesen Sie bitte hier:
http://helephant.com/2008/08/23/javascript-anonymous-functions/
InformationsquelleAutor der Antwort Harikesh Yadav
Den IIFE einfach teilt der Funktion und verbirgt die
msg
variable, um nicht zu "verschmutzen" den globalen Namensraum. In der Realität, nur halten Sie es einfach und tun, wie unten, es sei denn, Sie bauen eine Milliarden-dollar-website.Könnte man namespace Ihre
msg
Eigenschaft mit einer Revealing Module Pattern wie:InformationsquelleAutor der Antwort Ron Royston
Anonyme Funktionen gemeint sind one-shot-deal, wo Sie eine Funktion definieren, die on-the-fly, so dass es erzeugt eine Ausgabe aus, die Sie aus einem Eingang, die, den Sie bereitstellen. Außer, dass Sie nicht die Eingabe. Stattdessen, Sie schrieb etwas auf die zweite Zeile ("SO"); - eine unabhängige-Anweisung, die nichts zu tun hat mit der Funktion. Was hast du erwartet? 🙂
InformationsquelleAutor der Antwort Vietnhi Phuvan