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:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
Die Ausgabe lautet dann:
Me duplicate.
Me original.
Der Grund dafür ist, dass var
und function
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 verwendeten var f = function() {...
Konstrukt, nicht gehisst.
Nach dem Heben ist die Ausführung so, als wäre der Code:
var f; // declares var f, but does not assign it.
// name and define function f, shadowing the variable
function f() {
console.log("Me duplicate.");
}
// call the currently defined function f
f();
// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() {
console.log("Me original.");
}
// calls the function referenced by the var f
f();
* 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.