var Funktionsname = function() {} vs Funktion functionName() {}
Ich habe vor kurzem begonnen die Pflege jemand anderes JavaScript-code. Ich bin Fehler zu beheben, Funktionen hinzuzufügen und auch zu versuchen, um aufzuräumen den code und machen es mehr im Einklang.
Den früheren Entwickler verwendet zwei Arten deklarieren von Funktionen und ich kann nicht herausfinden, ob es einen Grund gibt oder nicht.
Diese zwei Wege sind:
var functionOne = function() {
//Some code
};
function functionTwo() {
//Some code
}
Was sind die Gründe für die Verwendung dieser zwei unterschiedlichen Methoden und was sind die vor-und Nachteile der einzelnen? Gibt es etwas, das getan werden kann, mit einer Methode, die nicht getan werden kann mit den anderen?
permadi.com/tutorial/jsFunc/index.html ist eine sehr gute Seite über javascript-Funktionen
Bezogen ist dieses ausgezeichnete Artikel auf Benannte Funktions-Ausdrücke.
Verweise dieses Artikels: kangax.github.com/nfe/#expr-vs-decl
Es gibt zwei Dinge, die Sie brauchen, um sich bewusst sein: #1 In JavaScript, Erklärungen sind gehisst. Was bedeutet, dass
Oh und btw, die korrekte syntax ist, die mit ";" nach der Abtretung ermächtigt, und ohne nach der Erklärung. E. g.
Bezogen ist dieses ausgezeichnete Artikel auf Benannte Funktions-Ausdrücke.
Verweise dieses Artikels: kangax.github.com/nfe/#expr-vs-decl
Es gibt zwei Dinge, die Sie brauchen, um sich bewusst sein: #1 In JavaScript, Erklärungen sind gehisst. Was bedeutet, dass
var a = 1; var b = 2;
wird var a; var b; a = 1; b = 2
. Also, wenn Sie erklären functionOne, es wird deklariert, aber deren Wert nicht sofort. In der Erwägung, dass seit functionTwo ist nur eine Erklärung, es wird auf der Oberseite des Anwendungsbereichs. #2 functionTwo können Sie Zugriff auf die name-Eigenschaft und das hilft sehr beim Debuggen etwas.Oh und btw, die korrekte syntax ist, die mit ";" nach der Abtretung ermächtigt, und ohne nach der Erklärung. E. g.
function f(){}
vs var f = function(){};
.InformationsquelleAutor Richard Garside | 2008-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst möchte ich korrigieren, Greg:
function abc(){}
bezieht sich auch der nameabc
ist definiert in dem Bereich, wo diese definition gefunden wird. Beispiel:Zweitens, es ist möglich, kombinieren die beiden Stile:
xyz
wird wie gewohnt definiert werden,abc
ist nicht definiert in allen Browsern, aber Internet Explorer — nicht darauf verlassen, dass die angegebenen. Aber es definiert in seinen Körper:Wenn Sie wollen, um alias-Funktionen auf allen Browsern, verwenden Sie diese Art der Erklärung:
In diesem Fall, beide
xyz
undabc
sind Aliase für dasselbe Objekt:Einen triftigen Grund für die Verwendung der kombinierten Stil ist der "name" - Attribut der Funktion Objekte (nicht unterstützt von Internet Explorer). Grundsätzlich, wenn Sie eine Funktion definieren, die wie
sein name wird automatisch zugewiesen. Aber wenn Sie es definieren wie
sein name ist leer — wir erstellt eine anonyme Funktion und zugewiesen, um einige Variablen.
Einen anderen guten Grund für die Verwendung der kombinierten Stil, ist die Verwendung einer kurzen internen Namen finden Sie zu sich selbst, während eine lange, nicht-widersprüchliche Namen für externe Benutzer:
In dem obigen Beispiel können wir das gleiche tun mit einem externen Namen, aber es ist zu sperrig (und langsamer).
(Eine andere Art zu beziehen zu sich selbst ist, zu verwenden
arguments.callee
, die noch relativ lange, und wird nicht unterstützt in der strict-Modus.)Tief unten, JavaScript behandelt beide Aussagen unterschiedlich. Dies ist eine Funktion Erklärung:
abc
hier ist überall definiert im aktuellen Bereich:Auch, es gehisst durch ein
return
Aussage:Dies ist eine Funktion Ausdruck:
xyz
hier wird definiert, ab dem Zeitpunkt der Zuweisung:Funktionsdeklaration vs. Funktion Ausdruck ist der wahre Grund, warum es einen Unterschied gibt, demonstriert Greg.
Fun fact:
Persönlich bevorzuge ich die Funktion "Ausdruck" Erklärung, denn auf diese Weise kann ich die Kontrolle über die Sichtbarkeit. Wenn ich die Funktion definiert wie
Weiß ich, dass ich die Funktion lokal. Wenn ich die Funktion definiert wie
Ich weiß, dass ich es definiert weltweit die Bereitstellung, den ich nicht definieren
abc
irgendwo in der Kette der Bereiche. Diese Art der definition elastisch ist, auch wenn Sie im innereneval()
. Während die definitionhängt vom Kontext ab, und lassen Sie raten, wo es ist tatsächlich definiert, vor allem im Fall von
eval()
— die Antwort ist: Es hängt von der browser.var xyz = function abc(){}; console.log(xyz === abc); Alle Browser, die ich getestet habe (Safari 4, Firefox 3.5.5, Opera 10.10) gibt mir "Undefined variable: abc".
Insgesamt denke ich, dass dieser post macht einen guten job zu erklären, die Unterschiede und die Vorteile der Verwendung der Funktion Erklärung. Ich werde Zustimmen, widersprechen, soweit die Vorteile der Nutzung der Funktion expression Zuweisungen zu einer variable vor allem, da der "nutzen" scheint eine Befürwortung der Deklaration einer globalen Einheit... und jeder weiß, dass Sie sollten nicht Unordnung der globalen namespace, richtig? 😉
imo ein großer Grund benannte Funktion ist da-Debugger verwenden können, den Namen zu helfen, den Sinn Ihres call-stack oder stack-trace. es saugt, wenn Sie die Aufrufliste betrachten und sehen, "anonyme Funktion" 10 Ebenen tief...
var abc = function(){}; console.log(abc.name);
nicht produzieren""
mehr, aber"abc"
statt.InformationsquelleAutor Eugene Lazutkin
Hier ist die Verminderung auf die standard-Formulare erstellen Funktionen: (Ursprünglich geschrieben für eine andere Frage, aber angepasst, nachdem er zog in die kanonische Frage.)
Begriffe:
Die quick-Liste:
Funktion Erklärung
"Anonymous"
function
Ausdruck (die trotz der Begriff, manchmal Funktionen erstellen, mit Namen)Namens
function
AusdruckAccessor-Funktion-Initialisierung (5+)
Pfeil Funktion Ausdruck (ES2015+) (die, wie anonyme Funktion Ausdrücken, nicht mit einem expliziten Namen, und doch können Funktionen erstellen, mit Namen)
Methode Erklärung im Objekt-Initialisierer (ES2015+)
Konstruktor und Methode Erklärungen in
class
(ES2015+)Funktion Deklaration
Die erste form ist eine Funktion Erklärung, die wie folgt aussieht:
Einer Funktionsdeklaration ist ein Erklärung; es ist nicht eine Anweisung oder ein Ausdruck. Als solche, die Sie nicht Folgen Sie es mit einem
;
(obwohl dabei so harmlos ist).Einer Funktionsdeklaration wird verarbeitet, wenn die Ausführung tritt der Kontext in dem es erscheint, vor jede Schritt-für-Schritt-code ausgeführt wird. Die Funktion, die es schafft, erhält einen richtigen Namen (
x
im Beispiel oben), und dieser name wird in dem Bereich, in dem die Erklärung erscheint.Weil es verarbeitet, bevor eine Schritt-für-Schritt-code in dem gleichen Zusammenhang, die Sie tun können, Dinge wie diese:
Bis ES2015, die spec nicht abdecken, was eine JavaScript-engine tun sollten, wenn Sie eine Funktion Deklaration innerhalb einer Kontrollstruktur wie
try
,if
,switch
,while
usw., wie diese:Und da sind Sie verarbeitet vor Schritt-für-Schritt-code ausgeführt wird, ist es schwierig zu wissen, was zu tun ist, wenn Sie sind in einer Kontroll-Struktur.
Obwohl dies zu tun war nicht angegeben bis ES2015, es war ein zulässige Erweiterung zur Unterstützung von Funktions-Deklarationen in Blöcken. Leider (und zwangsläufig), verschiedene Motoren haben verschiedene Dinge.
Als der ES2015, die Spezifikation sagt, was zu tun ist. In der Tat, es gibt drei verschiedene Dinge zu tun:
Die Regeln für die lose-Modi sind schwierig, aber in strengen - Modus, Funktions-Deklarationen in Blöcken sind einfach: Sie sind lokal zu dem block (Sie haben Blockbereich, das ist auch neu in ES2015), und Sie sind gehisst an der Spitze des Blocks. Also:
"Anonymous"
function
AusdruckDie zweite häufigste form wird als anonymen Funktion der Ausdruck:
Wie alle Ausdrücke, es bewertet, wenn es erreicht Sie in der Schritt-für-Schritt-Ausführung des Codes.
In ES5, die Funktion schafft dies hat keinen Namen (es ist anonym). In ES2015, die Funktion ist ein name zugeordnet, der, wenn möglich, von abzuleiten ist es aus dem Kontext. Im obigen Beispiel würde der name
y
. Etwas ähnliches geschieht, wenn die Funktion den Wert einer Eigenschaft Initialisierung. (Für details, wenn dies geschieht und die Regeln, Suche fürSetFunctionName
im die Spezifikation — es erscheint alle über Platz.)Namens
function
AusdruckDie Dritte form ist eine benannten Funktions-Ausdruck ("NFE"):
Dieser Funktion erstellt einen passenden Namen (
w
in diesem Fall). Wie alle Ausdrücke, diese wird ausgewertet, wenn es erreicht Sie in der Schritt-für-Schritt-Ausführung des Codes. Der name der Funktion ist nicht Hinzugefügt, um den Umfang, in dem der Ausdruck angezeigt wird; die Namen ist im Anwendungsbereich innerhalb der Funktion selbst:Beachten Sie, dass NFEs haben Häufig eine Quelle von bugs für JavaScript-Implementierungen. IE8 und früher, zum Beispiel, Griff NFEs völlig falsch, die Schaffung von zwei unterschiedlichen Funktionen in zwei verschiedenen Zeiten. Frühen Safari-Versionen hatten Probleme. Die gute Nachricht ist, dass aktuelle Versionen von Browsern (IE9 und höher, aktuelle Safari) nicht haben diese Probleme nicht mehr. (Aber als dies geschrieben wurde, leider, IE8 bleibt weit verbreitet, und so mit NFEs mit code für das web im Allgemeinen immer noch problematisch ist.)
Accessor-Funktion-Initialisierung (5+)
Manchmal Funktionen kann schleichen in weitgehend unbeachtet; das ist der Fall mit - accessor-Funktionen. Hier ist ein Beispiel:
Beachten Sie, dass, wenn ich die Funktion, die ich nicht verwenden
()
! Das ist, weil es eine accessor-Funktion für eine Eigenschaft. Wir Holen Sie und legen Sie die Eigenschaft in der üblichen Weise, aber hinter den kulissen, die die Funktion aufgerufen wird.Können Sie auch schaffen-accessor-Funktionen mit
Object.defineProperty
,Object.defineProperties
, und die weniger bekannte zweite argumentObject.create
.Pfeil Funktion Ausdruck (ES2015+)
ES2015 bringt uns die Pfeil-Funktion. Hier ein Beispiel:
Sehen, dass
n => n * 2
Sache, die sich in dermap()
nennen? Das ist eine Funktion.Ein paar Dinge, über die Pfeil-Funktionen:
Haben Sie nicht Ihre eigenen
this
. Stattdessen werden Sie in der Nähe über diethis
von dem Kontext, in dem Sie definiert sind. (Sie schließen Sie auch überarguments
- und, sofern relevant, diesuper
.) Dies bedeutet, dass diethis
in Ihnen ist der gleiche wie derthis
wo Sie entstanden sind, und kann nicht geändert werden.Wie Sie bemerkt haben werden mit den oben genannten, die Sie nicht verwenden das Schlüsselwort
function
; verwenden Sie stattdessen=>
.Den
n => n * 2
Beispiel oben ist eine form von Ihnen. Wenn Sie mehrere Argumente übergeben werden der Funktion, die Sie verwenden, parens:(Denken Sie daran, dass
Array#map
übergibt den Eintrag als erstes argument, und der index als das zweite.)In beiden Fällen, wird der Körper der Funktion ist ein Ausdruck, den Rückgabewert der Funktion wird automatisch das Ergebnis des Ausdrucks (Sie don ' T verwenden Sie eine explizite
return
).Wenn du machst mehr als nur einen einzigen Ausdruck verwenden
{}
und eine explizitereturn
(wenn Sie einen Rückgabewert hat), als normal:Die version ohne
{ ... }
wird als Pfeil-Funktion mit einem Ausdruck Körper oder prägnant Körper. (Auch: Ein prägnant Pfeil-Funktion.) Das mit{ ... }
Definition der Körper ist ein Pfeil-Funktion mit einem Funktion Körper. (Auch: Ein ausführliche Pfeil-Funktion.)Methode Erklärung im Objekt-Initialisierer (ES2015+)
ES2015 ermöglicht eine kürzere form erklärt, eine Eigenschaft, die auf eine Funktion namens ein Methode definition; es sieht wie folgt aus:
den fast-äquivalent bei 5 und früher wäre:
den Unterschied (außer Ausführlichkeit) ist, dass eine Methode verwenden
super
, aber eine Funktion nicht. So zum Beispiel, wenn Sie hatte ein Objekt definiert, dass (sagen wir)valueOf
mit der Methode syntax, es könntesuper.valueOf()
um den WertObject.prototype.valueOf
wieder zurück haben möchte (vor vermutlich etwas anderes zu tun mit ihm), in der Erwägung, dass die ES5-version zu tun habenObject.prototype.valueOf.call(this)
statt.Das bedeutet auch, dass die Methode eine Referenz auf das Objekt, das es definiert wurde, also wenn das Objekt temporär (zum Beispiel, Sie ' re passing es in
Object.assign
als einer der source-Objekte), Methode syntax könnte bedeuten, dass das Objekt im Speicher bleiben, wenn es sonst gewesen sein könnte Müll gesammelt (wenn die JavaScript-engine nicht erkennt, dass die situation und behandeln Sie es, wenn keiner der Methoden verwendetsuper
).Konstruktor und Methode Erklärungen in
class
(ES2015+)ES2015 bringt uns
class
syntax, einschließlich der deklarierten Konstruktoren und Methoden:Gibt es zwei Funktions-Deklarationen vor: Eine für den Konstruktor, der den Namen
Person
, und eine fürgetFullName
, der eine Funktion zugewiesenPerson.prototype
.w
wird einfach ignoriert ?Funktionsnamen sind für viele Dinge nützlich. Die beiden biggies in meiner Sicht sind Rekursion, und der name der Funktion angezeigt, die in call-stacks, Ausnahme Spuren, und so.
bedeutet nicht, es ist die beste Antwort, es bedeutet nur, dass es funktioniert für die person, die gefragt werden." Quelle
Ganz richtig. Lustig, obwohl, rechts, oben, dass es heißt: "Die besten Antworten zeigen zuerst, so dass Sie immer leicht zu finden." Da die akzeptierten Antworten zeigt sich zunächst sogar über die höhere Stimmen Antworten, die tour könnte etwas selbst zu widersprechen. 😉 Auch ein bisschen ungenau, wenn wir feststellen "besten" Stimmen (das ist nicht zuverlässig, es ist genau das, was wir haben), die "besten" Antworten zeigen nur auf den ersten, wenn Sie den "Stimmen" tab -- ansonsten werden die Antworten, die ersten sind die aktiven, oder die ältesten.
Vereinbart. 'arranged by date" ist manchmal ärgerlich.
InformationsquelleAutor T.J. Crowder
Sprechen über den globalen Kontext, sowohl die
var
- Anweisung und eineFunctionDeclaration
am Ende erstellen Sie ein nicht-deleteable Eigenschaft auf das Globale Objekt, sondern der Wert der beiden überschrieben werden kann.Den subtilen Unterschied zwischen den beiden Arten ist, dass wenn der Variable Instanziierung - Prozess ausgeführt wird (vor dem eigentlichen code execution) alle Bezeichner deklariert mit
var
wird initialisiert mitundefined
, und die, die von denFunctionDeclaration
's verfügbar sein wird, seit diesem moment, zum Beispiel:Die Zuordnung der
bar
FunctionExpression
erfolgt erst zur Laufzeit.Eine Globale Eigenschaft entsteht durch eine
FunctionDeclaration
überschrieben werden kann, ohne Probleme wie einen Variablen Wert, zum Beispiel:Ein weiterer deutlicher Unterschied zwischen den beiden Beispielen liegt darin, dass die erste Funktion keinen Namen, aber die zweite hat es, die wirklich nützlich beim Debuggen (also der überprüfung eines call-stack).
Über Ihre bearbeiteten ersten Beispiel (
foo = function() { alert('hello!'); };
), es ist eine nicht deklarierte Zuordnung, ich würde sehr empfehlen Ihnen, immer dievar
Stichwort.Mit einem Auftrag, ohne den
var
- Anweisung, wenn die referenzierten Bezeichner wird nicht in der scope-chain, wird es ein deleteable Eigenschaft des globalen Objekts.Auch, nicht gemeldeten Zuordnungen werfen
ReferenceError
auf ECMAScript 5 unter Strict-Modus.Unbedingt Lesen:
Hinweis: Diese Antwort wurde zusammengeführt aus eine andere Frage, in der die großen Zweifel und Missverständnis von der OP war, dass Bezeichner deklariert, mit einem
FunctionDeclaration
, konnte nicht überschrieben werden, was nicht der Fall ist.+0 - "Namen function expressions demystified" Artikel, wie es ist 404ing. Möglich Spiegel?: kangax.github.com/nfe
Nice one. Beachten Sie aber ich sah nie das original, so dass ich weiß nicht, ob das ein Spiegel ist oder nur ein weiterer Artikel mit dem gleichen Titel!
Ich bin mir ziemlich sicher, dass es ist, thewaybackmachine gesagt wird, es habe einen 302 zu kriechen, die Zeit und die Umleitung war der link, den Sie zur Verfügung gestellt.
InformationsquelleAutor CMS
Den beiden code-snippets, die du da gepostet hast, die für fast alle Zwecke, die gleiche Weise Verhalten.
Jedoch der Unterschied im Verhalten ist, dass mit der ersten Variante (
var functionOne = function() {}
), die Funktion kann nur aufgerufen werden, nachdem dieser Punkt im code.Mit der zweiten Variante (
function functionTwo()
), die Funktion steht code, der ausgeführt wird, über dem die Funktion deklariert ist.Dies ist, weil mit der ersten Variante, dem die Funktion zugeordnet ist die variable
foo
zur Laufzeit. In der zweiten, der die Funktion zugeordnet ist, der Bezeichner,foo
an-parse-Zeit.Weitere technische Informationen
JavaScript hat drei Möglichkeiten der Definition von Funktionen.
eval()
hat Ihre Probleme.InformationsquelleAutor thomasrutter
Eine bessere Erklärung zu Greg ' s Antwort
Warum keine Fehlermeldung? Wir waren immer gelehrt, dass die Ausdrücke ausgeführt werden von oben nach unten(??)
Weil:
Dies bedeutet, dass code wie dieser:
Beachten Sie, dass die Zuordnung Teil der Erklärungen waren nicht gehisst. Nur der name ist gehisst.
Aber in dem Fall mit Funktionsdeklarationen, die gesamte Funktionsrumpf wird gehisst sowie:
InformationsquelleAutor suhailvs
Anderen Kommentatoren bereits zurückgelegt haben der semantische Unterschied der beiden Varianten oben. Ich wollte beachten einen stilistischen Unterschied: Nur die "Belegung" Variante festlegen einer Eigenschaft eines anderen Objekts.
Ich oft bauen JavaScript-Module mit einem Muster wie dieses:
Diesem Muster, Ihren öffentlichen Funktionen verwenden alle die Abtretung, während Ihre privaten Funktionen verwenden Erklärung.
(Beachten Sie auch, dass die Zuordnung sollte erfordern ein Semikolon nach der Anweisung, während die Deklaration verbietet es.)
var foo = function(){...}
syntax auch für den privaten Variablen.Dies ist nicht ganz wahr, in einigen älteren Versionen von IE, eigentlich. (
function window.onload() {}
war ein Ding.)InformationsquelleAutor Sean McMillan
Illustration, wenn Sie bevorzugen die erste Methode, die zweite ist, wenn Sie brauchen, um zu vermeiden überschreiben einer Funktion die vorherigen Definitionen.
Mit
diese definition von
myfunction
überschreibt jede Vorherige definition, da es getan werden bei der parse-time.Während
nicht den richtigen job zu definieren
myfunction
nur, wenncondition
erfüllt ist.var myFunc = null;
außerhalb einer Schleife oder außerhalb eines if - /elseif - /else-block. Dann können Sie bedingt, weisen unterschiedliche Funktionen auf die gleiche variable. In JS ist es eine bessere übereinkommens weisen einen fehlenden Wert auf null, dann auf "undefined". Daher sollten Sie erklären myFunction als null erste, dann weisen Sie es später, bedingt.InformationsquelleAutor Mbengue Assane
Ein wichtiger Grund ist das hinzufügen von eine und nur eine variable als "Root" - namespace...
oder
Gibt es viele Techniken für Verwendung von Namensräumen. Es ist wichtiger geworden mit der fülle von JavaScript-Modulen zur Verfügung.
Siehe auch Wie kann ich deklarieren einen namespace in JavaScript?
InformationsquelleAutor Rob
Hochziehen ist der JavaScript-interpreter die Aktion des Verschiebens aller Variablen-und Funktionsdeklarationen an die Spitze des aktuellen Gültigkeitsbereichs.
Jedoch nur die eigentlichen Erklärungen sind gehisst. durch das verlassen Zuweisungen wo Sie sind.
Variable
Javascript aufgerufen wird lose typisierte Sprache. Was bedeutet Javascript-Variablen halten kann, der Wert jeder Daten-Typ. Javascript kümmert sich automatisch um das ändern der Variablen-Typ basierend auf dem Wert/literal sofern während der Laufzeit.
Funktion
Default-Rückgabewert der Funktion ist"undefined', Variable Erklärung default-Wert 'undefined'
Funktion Erklärung
Funktion Ausdruck
Funktion variable zugewiesen Beispiel:
javascript interpretiert als
Können Sie überprüfen, Funktion der Erklärung, Ausdruck testen über verschiedene browser benutzt
jsperf-Test-Runner
ES5 Konstruktor-Funktion Klassen: Funktion erstellte Objekte mit Funktion.der Prototyp.binden
JavaScript behandelt Funktionen als first-class-Objekte, so dass ein Objekt, können Sie Eigenschaften zuweisen einer Funktion.
ES6 eingeführt Pfeil-Funktion: Ein Pfeil Funktionsausdruck hat eine kürzere syntax, Sie sind am besten geeignet für nicht-Methode funktioniert, und Sie können nicht verwendet werden, da Konstruktoren.
InformationsquelleAutor Yash
Ich bin hinzufügen, meine Antwort, nur weil alle anderen abgedeckt hat, den Hub-Teil gründlich.
Hab ich mich gewundert über den Weg, ist besser für eine lange Zeit jetzt, und Dank http://jsperf.com jetzt weiß ich es 🙂
Funktionsdeklarationen sind schneller, und das ist, was wirklich zählt in web-dev, richtig? 😉
Naja, ich fand es anders herum mit Firefox. jsperf.com/sandytest
Microbenchmarks immer fehl. Auf der Suche nach jsperf.com ist das verschwenden von Zeit. Was Sie wirklich brauchen, zu suchen ist zu JS-engine, source-code, offizielle Dokumentation, oder zumindest schnuppern dev blogs oder mail-Listen.
Nur ein update, da bin ich wieder voll funktionalen Programmierstil in JavaScript nun, ich nie verwenden, Erklärungen, nur Funktion Ausdrücken, so kann ich die Kette, und rufen Sie meine Funktionen durch Ihre Variablen-Namen. Check-out RamdaJS...
Ich nur führen Sie Ihre eigenen test in Firefox 50.0.0 / Windows 7 0.0.0, und es ist eigentlich der gleiche Weg wie Leon ist. Also, wenn Ihr test korrekt ist, würde ich schlussfolgern, dass jsperf-tests sind nicht indicatives, und alles hängt von Ihrem browser und / oder OS-version, oder in dem besonderen Zustand der aktuellen Maschine in diesem bestimmten moment.
InformationsquelleAutor Leon Gaban
Einer Funktions-Deklaration und eine Funktion Ausdruck einer Variablen zugewiesen, Verhalten sich auf die gleiche nachdem die Bindung hergestellt ist.
Es ist ein Unterschied aber bei wie und wenn die function-Objekt ist tatsächlich im Zusammenhang mit seiner Variablen. Dieser Unterschied ist durch den Mechanismus genannt variable Hubgeschwindigkeit in JavaScript.
Grundsätzlich alle Deklarationen und Variablen-Deklarationen gehisst werden, an die Spitze der Funktion in dem die Erklärung erfolgt (dies ist der Grund, warum wir sagen, dass JavaScript Funktionsumfang).
Wenn eine Funktion Erklärung ist gehisst, der Hauptteil der Funktion "folgt"
also, wenn Sie den Rumpf der Funktion ausgewertet wird, die variable wird sofort
gebunden werden, um ein function-Objekt.
Wenn eine Variablen-Deklaration ist gehisst, die Initialisierung hat nicht
Folgen, aber "left behind". Die variable wird initialisiert
undefined
am Anfang der Funktion Körper, und werden zugeordnetein Wert, der an seiner ursprünglichen Stelle im code. (Tatsächlich, es wird ein Wert zugewiesen, bei jeder Ort, wo eine Deklaration einer variable mit dem gleichen Namen Auftritt.)
Die Reihenfolge der Hub ist auch wichtig: Deklarationen haben Vorrang vor Variablen-Deklarationen mit dem gleichen Namen, und die Letzte Funktion Deklaration Vorrang vor vorherigen Funktion Deklarationen mit dem gleichen Namen.
Einige Beispiele...
Variable
foo
gehievt wird, um den Anfang der Funktion, initialisiertundefined
, so dass!foo
isttrue
, sofoo
zugeordnet ist10
. Diefoo
außerhalb derbar
's Umfang spielt keine Rolle und ist unberührt.Funktion Erklärungen Vorrang vor den Deklarationen von Variablen, und die Letzte Funktion Erklärung "sticks".
In diesem Beispiel
a
initialisiert wird mit dem function-Objekt, das sich aus der Auswertung des zweiten Funktion Erklärung, und dann ist zugeordnet4
.Hier die Deklaration der Funktion gehievt wird zuerst deklarieren und initialisieren der variable
a
. Nächsten, wird dieser der variable zugewiesen ist10
. In anderen Worten: die Zuweisung nicht zuordnen äußere variablea
.Ausgezeichnete post. Ein "self-executing-Funktion' oder 'sofort invoked function expression' sollte einfach genug, um zu sehen, und sein Stil Vorliebe sollte nicht davon ablenken, dass seine post - präzise und fasst 'hochziehen' perfekt. +1
InformationsquelleAutor eljenso
Das erste Beispiel ist eine Funktion Erklärung:
Das zweite Beispiel ist eine Funktion Ausdruck:
Der wesentliche Unterschied ist, wie Sie gehisst werden, (aufgehoben und erklärt). Im ersten Beispiel, die ganze Funktion Erklärung ist gehisst. Im zweiten Beispiel wird nur die var " abc " ist gehisst, wird der Wert (die Funktion) werden nicht definiert und die Funktion selbst bleibt an der position, in der Sie deklariert ist.
Um es einfach auszudrücken:
Studium mehr zu diesem Thema, die ich empfehlen Ihnen dringend, diese
link
Der Hauptgrund für dieses posting eine Antwort war auf den link unten. Dies war das Stück, das fehlt mir, zu verstehen, die oben genannte Frage.
Es ist sehr cool, dass Sie teilen wollten den link. Aber auch links zu weiteren Informationen, die in SO, soll einfach ein Kommentar auf entweder die Frage oder Ihre Lieblings-Antwort. Es ist sehr sub-optimal, um Unordnung eine lange, komplizierte Seite wie diese mit sich wiederholenden Informationen nur um einen einzigen nützlichen link am Ende. Nein, Sie bekommen keine rep-Punkte für die Bereitstellung der Verbindung, aber Sie werden helfen, die Gemeinschaft.
InformationsquelleAutor sla55er
In Bezug auf die code-Wartung Kosten, genannten Funktionen sind mehr vorzuziehen:
Ich vermute, mehr VORTEILE für benannte Funktionen werden Folgen. Und was ist aufgelistet als ein Vorteil der genannten Funktionen ist ein Nachteil für anonymer.
Historisch, anonyme Funktionen erschien aus der Unfähigkeit von JavaScript als Sprache zu Liste der Mitglieder mit benannten Funktionen:
InformationsquelleAutor Sasha Firsov
Verwende ich die variable Ansatz in meinem code für einen ganz bestimmten Grund, die Theorie, die gewesen bedeckt in abstrakter Weise vor, aber ein Beispiel mag helfen, einige Leute wie mich, die mit begrenzten JavaScript-know-how.
Habe ich code, den ich ausführen muss, mit 160-unabhängig-brandings entwickelt. Die meisten der code in freigegebenen Dateien, aber branding-spezifische Zeug ist in einer separaten Datei, einer für jedes branding.
Einige Marken erfordern spezifische Funktionen, und einige tun nicht. Manchmal habe ich auch das hinzufügen neuer Funktionen für die neue branding-spezifische Dinge. Ich bin froh, ändern Sie die freigegebenen codiert, aber ich will nicht zu ändern, alle 160 Sätze von branding-Dateien.
Indem Sie die variable syntax, ich kann die variable deklariert (eine Funktion, die Zeiger im wesentlichen) in den gemeinsamen code und entweder weisen eine triviale stub-Funktion oder auf null gesetzt.
Den ein oder zwei Marken, die eine spezielle Implementierung der Funktion können dann definieren, Ihre version der Funktion und weisen Sie diese der Variablen, wenn Sie wollen, und der rest tut nichts. Ich kann den test für null-Funktion, bevor ich es ausführen in den gemeinsamen code.
Von Menschen die Kommentare oben, ich nehme an, es könnte möglich sein, neu zu definieren, eine statische Funktion zu, aber ich denke, dass die variable Lösung ist schön und klar.
InformationsquelleAutor Herc
In der informatik Bedingungen, wir reden über anonyme Funktionen und Namen-Funktionen. Ich denke, der wichtigste Unterschied ist, dass eine anonyme Funktion ist nicht gebunden an einen Namen, daher der name der anonymen Funktion. In JavaScript ist es ein erste-Klasse-Objekt dynamisch deklariert Laufzeit.
Weitere Informationen über anonyme Funktionen und lambda-Kalkül, Wikipedia ist ein guter Anfang (http://en.wikipedia.org/wiki/Anonymous_function).
InformationsquelleAutor Kafka
Greg ' s Antwort ist gut genug, aber ich möchte noch etwas hinzufügen, die ich gelernt, nur jetzt gerade Douglas Crockford ist videos.
Funktion Ausdruck:
Function-Anweisung:
Den function-Anweisung ist einfach eine Kurzform für
var
- Anweisung mit einerfunction
Wert.So
erweitert, um
Welche expandiert weiter zu:
Und Sie sind beide auf die Spitze gehievt der code.
Haben Sie einen Blick auf diese code-Beispiele: gist.github.com/cyberthom/36603fbc20de8e04fd09
InformationsquelleAutor Rohan
@EugeneLazutkin gibt ein Beispiel, wo er Namen, die eine zugewiesene Funktion nutzen zu können
Verknüpfung()
als interne Referenz auf sich selbst. John Resig gibt ein weiteres Beispiel - kopieren einer rekursiven Funktion, der Sie zugeordnet zu einem anderen Objekt in seinem Learning Advanced Javascript tutorial. Während die Zuordnung von Funktionen zu den Eigenschaften ist nicht unbedingt die Frage ist hier, empfehle ich aktiv versucht das tutorial aus - führen Sie den code durch Klick auf die Schaltfläche in der oberen rechten Ecke, und doppelklicken Sie auf den code zu Bearbeiten, um Ihrem Geschmack.Beispiele aus dem tutorial: rekursive Aufrufe in
yell()
:Tests schlagen fehl, wenn die original-ninja-Objekt wird entfernt. (Seite 13)
Wenn Sie den Namen der Funktion, die rekursiv aufgerufen, die tests übergeben werden. (Seite 14)
this.yell
funktioniert auch 🙂InformationsquelleAutor Joel Purra
Ein weiterer Unterschied, der nicht erwähnt wird in den anderen Antworten, dass, wenn Sie die Verwendung der anonymen Funktion
und verwenden, die wie ein Konstruktor, wie in
dann
one.constructor.name
werden nicht definiert.Function.name
ist nicht standard, sondern wird von Firefox, Chrome, other Webkit-abgeleiteten Browsern und IE 9+.Mit
ist es möglich, zum abrufen der name der Konstruktor als string mit
two.constructor.name
.In diesem Beispiel sind die zwei=new wird eine Globale Funktion, da keine var
InformationsquelleAutor Ingo Kegel
Wenn Sie verwenden diese Funktionen, um Objekte zu erstellen, die Sie erhalten würden:
console.log(objectOne.__proto__);
Drucke "functionOne {}" in meine Konsole. Irgendwelche Ideen, warum dies der Fall sein kann?Ich kann nicht scheinen, um es zu reproduzieren, wie gut.
Dies ist eine Fähigkeit, Ihrer debugger (Anzeige der "Klasse" des angemeldeten Objekt), und die meisten sind in der Lage, um daraus einen Namen für anonyme Funktionsausdrücke in diesen Tagen. Btw, Sie sollten deutlich machen, dass es keinen funktionalen Unterschied zwischen den beiden Instanzen.
InformationsquelleAutor Pawel Furmaniak
Die erste (Funktion doSomething(x)) sollten Teil eines Objekts-notation.
Zweiten (
var doSomething = function(x){ alert(x);}
) ist, erstellen Sie einfach eine anonyme Funktion und Zuweisung an eine variabledoSomething
. So doSomething() wird die Funktion aufrufen.Möchten Sie vielleicht wissen, was für ein Funktion Erklärung und Funktion Ausdruck ist.
Einer Funktionsdeklaration definiert eine benannte variable, Funktion ohne Variablen-Zuordnung. Funktionsdeklarationen auftreten als eigenständige Konstrukte und können nicht geschachtelt werden innerhalb der nicht-Funktions-blocks.
In der obigen Bedingung der name der Funktion wird sichtbar in seinem Rahmen und Umfang, den Ihre Muttergesellschaft (sonst wäre es nicht erreichbar).
Und in einem Funktionsausdruck
Funktion-Ausdruck definiert eine Funktion als Teil eines größeren Ausdrucks-syntax (in der Regel eine variable Zuordnung ). Definierten Funktionen über Funktionen Ausdrücke können mit Namen oder anonym. Funktionsausdrücke sollte nicht beginnen mit "Funktion".
InformationsquelleAutor NullPoiиteя
Liste ich die Unterschiede unter:
Einer Funktion Deklaration kann an beliebiger Stelle im code. Auch wenn es aufgerufen wird, bevor die definition wird im code ausgeführt als Funktion der Erklärung verpflichtet ist, den Speicher oder in einer Weise, die es ist nach oben zog, vor jedem anderen code in die Seite mit der Ausführung beginnt.
Werfen Sie einen Blick auf die untenstehende Funktion:
Dies ist, weil, während der Ausführung, wie es aussieht:-
Einem Funktionsausdruck, wenn nicht definiert ist, bevor Sie ihn aufrufen, wird in einem Fehler resultieren. Auch hier die definition der Funktion selbst ist nicht verschoben, um die Spitze oder im Gedächtnis, wie in den Funktionsdeklarationen. Aber die variable, auf welche weisen wir die Funktion wird gehisst und undefined zugewiesen bekommt es.
Gleiche Funktion mit der Funktion Ausdrücken:
Dies ist, weil während der Ausführung sieht es so aus:
Es ist nicht sicher, zu schreiben, Funktionsdeklarationen in nicht-Funktions-blocks wie wenn, weil Sie nicht zugänglich sein.
Benannten Funktions-Ausdruck wie dem folgenden, kann nicht arbeiten in Internet Explorer-Browsern vor version 9.
Sie haben, um zu verstehen, beantworten alte Fragen, ist nicht schlecht. Wenn es waren zu sein, SO hätte eine solche Barriere. Man Stelle sich vor, eine änderung in der API(wenn auch nicht in dieser Frage-Kontext), und jemand spots und liefert eine Antwort mit der neuen API sollte das nicht erlaubt sein?? Bis und es sei denn, die Antwort macht keinen Sinn und gehört nicht hierher, wäre es downvoted und automatisch entfernt. Sie brauchen nicht die Mühe mit!!!!!!
InformationsquelleAutor varna
Im Licht der "benannten Funktionen zeigen, bis in stack-traces" - argument, modernen JavaScript-engines sind eigentlich durchaus in der Lage, die Vertretung anonyme Funktionen.
Schreiben, V8, SpiderMonkey, Chakra und Nitro beziehen sich immer auf die benannten Funktionen, die durch Ihre Namen. Sie fast immer beziehen sich auf eine anonyme Funktion, indem Sie Ihre id, wenn es eines hat.
SpiderMonkey herausfinden können, den Namen eines anonymen Funktion zurückgegeben, die von einer anderen Funktion. Der rest kann nicht.
Wenn Sie wirklich, wirklich wollten, dass Ihre iterator und Erfolg Rückrufe zu zeigen, bis in der Spur, Sie nennen könnten, auch diejenigen...
Aber zum größten Teil ist es nicht Wert, zu betonen, über.
Kabelbaum (Fiddle)
V8
SpiderMonkey
Chakra
Nitro
InformationsquelleAutor Jackson
In JavaScript gibt es zwei Möglichkeiten, um Funktionen erstellen:
Funktion Erklärung:
Dies ist sehr einfach, selbsterklärend, verwendet in vielen Sprachen und in standard in der C-Familie von Sprachen. Wir erklärten eine Funktion definiert und ausgeführt durch den Aufruf von it.
Was Sie sollte wissen, ist, dass Funktionen auch tatsächlich Objekte in JavaScript; intern haben wir ein Objekt erstellt für die obige Funktion und einen Namen rief fn-Taste oder die Referenz auf das Objekt gespeichert ist, in fn. Funktionen sind Objekte in JavaScript; eine Instanz der Funktion ist eigentlich eine Objekt-Instanz.
Funktion Ausdruck:
JavaScript first-class-Funktionen, d.h. eine Funktion erstellen und es einer Variablen zuweisen, nur wie erstellen Sie einen string oder eine Zahl, und weisen Sie es einer Variablen. Hier die fn-variable ist eine Funktion zugeordnet. Der Grund für dieses Konzept ist Funktionen sind Objekte in JavaScript; fn zeigt auf die Objektinstanz, von der oben genannten Funktion. Wir haben initialisiert eine Funktion aus und vergab ihn an eine variable. Es ist nicht die Ausführung der Funktion und zuordnen das Ergebnis.
Referenz: JavaScript Funktion Deklaration syntax: var fn = function() {} vs Funktion fn() {}
var fn = function fn() {...}
?Hi Chharvey, nicht sicher über die ur Frage, ich denke u r spricht über die Funktion des Ausdrucks, die ich bereits erwähnt habe. Allerdings, wenn es immer noch einige Verwirrung nur mehr elaborative.
ja, ich wurde gefragt, über ein namens - Funktion Ausdruck. es ist ähnlich wie die option #2 mit der Ausnahme, dass die Funktion hat einen Bezeichner. in der Regel diese Kennung ist die gleiche wie die variable wird zugewiesen, aber das ist nicht immer der Fall.
Ja Named function expression ist ähnlich wie meine option #2. Gut haben einen Bezeichner ist nicht vorgeschrieben, da es nicht verwendet. Wenn Sie die Ausführung der Funktion Ausdruck verwenden Sie die variable halten Sie die function-Objekt. Identifier dient keinem Zweck.
InformationsquelleAutor Anoop Rai
Beide sind verschiedene Arten der Definition einer Funktion. Der Unterschied ist, wie der browser interpretiert und lädt diese in einen Kontext für die Ausführung.
Ersten Fall ist die Funktion Ausdrücke, die lädt nur, wenn der interpreter erreicht, dass die code-Zeile. Also, wenn du es so machst wie die folgenden, erhalten Sie eine Fehlermeldung, dass die functionOne ist nicht eine Funktion.
Der Grund ist, dass in der ersten Zeile kein Wert zugewiesen wird functionOne, und es ist daher nicht definiert. Versuchen wir es nennen, als eine Funktion, und damit bekommen wir einen Fehler.
In der zweiten Zeile wir der Zuordnung der Referenz von einer anonymen Funktion functionOne.
Zweiten Fall ist der Funktionsdeklarationen, die geladen wird, bevor irgendein code ausgeführt wird. Also, wenn Sie tun, wie die folgenden Sie erhalten keine Fehler, wie die Erklärung lädt vor dem ausführen von code.
InformationsquelleAutor Nitin9791
Über die Leistung:
Neuen Versionen von
V8
führte mehrere unter-die-Haube-Optimierungen und so hatSpiderMonkey
.Es ist fast kein Unterschied nun zwischen Ausdruck und Erklärung.
Funktion Ausdruck scheint schneller zu sein jetzt.
Chrome 62.0.3202
FireFox-55
Chrome Canary 63.0.3225
Firefox
Chrome Canary
Chrome
Es gibt keinen Unterschied. Schau mal hier: jsperf.com/empty-tests-performance
InformationsquelleAutor Panos Kal.
Sind Sie ziemlich ähnlich, mit einigen kleinen unterschieden, das erste ist eine variable, die zugeordnet, um eine anonyme Funktion (Funktions-Deklaration) und das zweite ist der normale Weg, um eine Funktion zu erstellen, die in JavaScript Anonyme Funktion-Deklaration), die beide die Nutzung, Nachteile und Vorteile:
1. Funktion Ausdruck
Einer Variablen zuweisen einer Funktion bedeutet nicht Hochziehen, wie wir wissen Funktionen in JavaScript kann Hissen, bedeutet, Sie können aufgerufen werden, bevor Sie deklariert, während die Variablen müssen deklariert werden, bevor man Zugang zu Ihnen haben, so bedeutet in diesem Fall können wir nicht auf die Funktion vor, wo es erklärt, es auch ein Weg sein könnte, dass Sie Ihre Funktionen schreiben, für die Funktionen, die Rückkehr einer anderen Funktion dieser Art von Erklärung könnte Sinn machen, auch in ECMA6 & oben können Sie diese zuordnen zu einem Pfeil-Funktion, die verwendet werden können, zu nennen, anonyme Funktionen, auch auf diese Weise zu deklarieren, ist ein besserer Weg, um erstellen Konstruktor-Funktionen in JavaScript.
2. Funktion Erklärung
Dies ist der normale Weg, den Aufruf einer Funktion in JavaScript, kann diese Funktion aufgerufen werden, bevor Sie selbst es erklären, da in JavaScript alle Funktionen erhalten Gehisst, aber wenn du 'use strict' - das wird nicht Hissen, wie erwartet, es ist eine gute Möglichkeit zu nennen, alle normalen Funktionen, die nicht in großen Linien und weder eine Konstruktor-Funktion.
Auch, wenn Sie mehr Informationen darüber, wie Sie hochziehen funktioniert in JavaScript, besuchen Sie den link unten:
https://developer.mozilla.org/en-US/docs/Glossary/Hoisting
...also this way of declaring is a better way to create Constructor functions in JavaScript
, können Sie bitte erläutern, ich bin gespannt!Ein Grund dafür ist, weil alle eingebauten Konstruktor-Funktionen, die in JavaScript erstellt, wie diese Funktion Anzahl() { [native code] } und Sie sollten nicht verwechselt werden mit dem eingebauten, auch die Referenzierung später in diesem Fall sicherer ist und man am Ende sauberer code, aber nicht mit hochziehen...
InformationsquelleAutor Alireza
Gibt es nur diese beiden Möglichkeiten der Deklaration von Funktionen, und in der zweite Weg, können Sie die Funktion vor der Deklaration.
InformationsquelleAutor Tao
new Function()
können verwendet werden, um pass die Funktion, den Körper in einen string. Und damit dies kann verwendet werden, um dynamische Funktionen. Auch übergeben Sie das Skript ohne das Skript ausgeführt wird.InformationsquelleAutor SuperNova