Ich habe das folgende Skript geschrieben, um zu sehen, was passiert, wenn einer Variablen und einer Funktion, der eine Funktion zugewiesen ist, ihre Namen kollidieren:
var f = function() {
console.log("Me original.");
}
function f() {
console.log("Me duplicate.");
}
f();
Die Ausgabe, die ich bekomme, ist "Me original". Warum wurde die andere Funktion nicht aufgerufen?
Wenn ich meine ursprüngliche Zuordnung in ändere var f = new function() {
, erhalte ich "Me original", gefolgt von einem TypeError-Spruch object is not a function
. Kann mir bitte jemand erklären?
javascript
function
ankush981
quelle
quelle
Antworten:
Funktionsdeklarationen werden in JavaScript gehisst (nach oben verschoben). Obwohl in Bezug auf die Analysereihenfolge falsch, ist der Code, den Sie haben, semantisch derselbe wie der folgende, da Funktionsdeklarationen hochgezogen werden:
Was wiederum mit Ausnahme des Funktionsnamens derselbe ist wie:
Was wiederum aufgrund des variablen Hebens dasselbe ist wie:
Was erklärt, was Sie bekommen, überschreiben Sie die Funktion. Im Allgemeinen
var
sind in JavaScript mehrere Deklarationen zulässig - diesvar x = 3; var x = 5
ist völlig legal. Im neuen ECMAScript 6-Standardlet
verbieten Aussagen dies.Dieser Artikel von @kangax leistet hervorragende Arbeit bei der Entmystifizierung von Funktionen in Javascript
quelle
function f()
zuvar f = function()
so viel? Sind Hebe- und Funktionsnamen wirklich der einzige Unterschied?f
angehoben, und die"Me Original"
Version wird erst später angehoben . Sie werden jeweils nach oben verschoben, jedoch in derselben Reihenfolge. Ich möchte nur hinzufügen, dass Sie im Allgemeinen nicht mehrere Funktionen auf die gleiche Weise benennen sollten :)var
denselben Namen zweimal im selben Bereich verwenden.Wenn es nicht so aussieht, als hätte jemand Ihre Folgefrage beantwortet, werde ich sie hier beantworten, obwohl Sie Folgefragen im Allgemeinen als separate Fragen stellen sollten.
Sie haben gefragt, warum das so ist:
druckt "Me original" aus. und dann ein Fehler.
Was hier passiert, ist,
new
dass die Funktion als Konstruktor verwendet wird. Das entspricht also dem Folgenden:Und dank der von Benjamin erläuterten Funktion zum Heben ist das oben Gesagte im Wesentlichen gleichbedeutend mit:
Dieser Ausdruck:
bewirkt, dass ein neues Objekt erstellt und zugewiesen wird
f
, wobei eine anonyme Funktion als Konstruktor verwendet wird. "Ich original." wird ausgedruckt, während der Konstruktor ausgeführt wird. Aber das Objekt, das konstruiert wird, ist selbst keine Funktion. Wenn dies schließlich ausgeführt wird:Sie erhalten eine Fehlermeldung, da dies
f
keine Funktion ist.quelle
Verzeihen Sie mir, wenn dies der falsche Weg ist, einen Punkt hinzuzufügen. Ich war nicht so oft hier und würde konstruktive Anweisungen und / oder Kritik begrüßen.
Benjamins Antwort spricht die Frage des OP hervorragend an, aber ich möchte eine Optimierung hinzufügen, die uns einen vollständigen Überblick über das Heben und seine Kuriositäten gibt.
Wenn wir den ursprünglichen Code mit einem Aufruf von beginnen
f
, wie folgt:Die Ausgabe lautet dann:
Der Grund dafür ist, dass
var
undfunction
Aussagen auf leicht unterschiedliche Weise gehisst werden.Denn
var
die Deklaration wird an den Anfang des aktuellen Bereichs * verschoben, aber eine Zuordnung wird nicht gehisst. Der Wert der deklarierten Variable ist undefiniert, bis die ursprüngliche Zuweisungszeile erreicht ist.Bei
function
Anweisungen werden sowohl die Deklaration als auch die Definition angehoben. Funktion Ausdrücke , wie sie in dem verwendetenvar f = function() {...
Konstrukt, nicht gehisst.Nach dem Heben ist die Ausführung so, als wäre der Code:
* Der gesamte JavaScript-Bereich ist ein lexikalischer oder Funktionsbereich, aber es schien, als würde es die Dinge nur verwirren, das f-Wort an diesem Punkt zu verwenden.
quelle