Unterschied zwischen "anonymer Funktion" und "Funktionsliteral" in JavaScript?

8

Das Buch JavaScript lernen definiert anonyme Funktionen wie folgt ...

  

Funktionen sind Objekte. So können Sie sie erstellen - genau wie ein String oder Array oder ein anderer Typ - indem Sie einen Konstruktor verwenden und die Funktion einer Variablen zuweisen. Im folgenden Code wird eine neue Funktion mit dem Konstruktor Function erstellt, wobei der Funktionskörper und das Argument als Argumente übergeben werden:

%Vor%      

Diese Art von Funktion wird oft als anonyme Funktion bezeichnet, weil die Funktion selbst nicht direkt deklariert oder benannt wird.

Ist das die korrekte Definition einer "anonymen Funktion" in JavaScript? Wenn nicht, was ist eine anonyme Funktion und gibt es einen Unterschied zwischen einer anonymen Funktion und einem Funktionsliteral?

    
Richard JP Le Guen 02.05.2011, 13:03
quelle

5 Antworten

16

Funktionsausdrücke und Funktionsdeklarationen

Da Sie sich für Funktionen interessieren, hier einige wichtige Dinge zu wissen.

var abc = function() { ... } ist als Funktionsausdruck bekannt. Die Variable wird dieser anonymen Funktion zur Ausführungszeit zugewiesen, obwohl ihre Variablendeklaration an den Anfang des aktuellen Ausführungskontexts (Gültigkeitsbereich) gehängt wird.

Ein Funktionsausdruck kann jedoch auch einen Namen erhalten, so dass er innerhalb seines Körpers aufgerufen werden kann, um ihn rekursiv zu machen. Denken Sie daran IE hat einige Probleme damit. Wenn Sie ihm einen Namen zuweisen, ist es definitiv nicht eine anonyme Funktion.

Eine Funktion wie function abc() { ... } wird als Funktionsdeklaration bezeichnet. Ihre Definition wird an die Spitze ihres Geltungsbereichs gehoben. Sein Name ist innerhalb des Bereichs und des übergeordneten Bereichs verfügbar.

Weitere Lektüre .

Ihr Beispiel

Es ist eine anonyme Funktion, die jedoch der Variablen sayHi zugeordnet ist.

Wie Šime Vidas erwähnt, wird ein neues Objekt Function mit dem Operator new instanziiert, und Die Argumente und der Funktionskörper werden als Strings übergeben. Das resultierende Objekt wird sayHi zugewiesen.

Die reale Verwendung einer Funktion, die diese Methode verwendet, ist selten (obwohl sie nur dazu dienen kann, zu zeigen, dass Funktionen Objekte sind). Ich glaube auch, dass die Übergabe der Argumentliste und des Funktionskörpers als String eine Funktion eval() type aufrufen wird, was selten gut ist, wenn ein viel besseres Konstrukt verfügbar ist.

Auch Funktionen, die mit Function erstellt wurden keine Schließung bilden .

Ich würde diese Methode nur verwenden, wenn ich aus irgendeinem Grund ein Function mit seinen Argumenten und / oder meinem Körper als String erstellen müsste.

In der realen Welt würden Sie ...

machen %Vor%

Siehe auch Kommentare von Felix und Šime für gute Diskussion und weitere Klärung.

    
alex 02.05.2011, 13:07
quelle
1

Ich denke, eine breitere und akzeptiertere Definition einer anonymen Funktion ist eine Funktion, die ohne Namen erstellt wird.

    
Andrew Hare 02.05.2011 13:07
quelle
1

Eine anonyme Funktion ist einfach eine Funktion ohne Namen.

%Vor%

Der obige Code wäre nutzlos, da er keinen Namen hat, zu dem man ihn nennen könnte. Daher werden sie normalerweise einer Variablen zugewiesen.

%Vor%

Dies ist hilfreich, da Sie eine anonyme Funktion an eine andere Funktion oder Methode übergeben können, ohne die Funktion vorher erstellen zu müssen, wie unten gezeigt.

%Vor%     
Ryan 02.05.2011 13:13
quelle
1

Dies:

%Vor%

und das:

%Vor%

sind zwei Ausdrücke, die das gleiche Ergebnis liefern - sie geben ein neues anonymes Funktionsobjekt zurück.

Der zweite Ausdruck (und nur der zweite Ausdruck) wird als Funktionsausdruck bezeichnet. Sie können es auch als Funktionsliteral bezeichnen (obwohl wir argumentieren könnten, dass eine Funktionsdeklaration auch ein Funktionsliteral ist).

    
Šime Vidas 02.05.2011 13:37
quelle
0
%Vor%     
gion_13 02.05.2011 13:09
quelle

Tags und Links