Dies hat nichts mit Pfeilfunktionen zu tun. Vielmehr werden reguläre Funktionen (und varDeklarationen) gehisst ; Unabhängig davon, wo Sie sie schreiben, werden sie an die Spitze ihres Bereichs verschoben. Tatsächlich sind beide Codebeispiele völlig identisch und sehen folgendermaßen aus:
var increment; // hoisted
function increment() { // hoisted
alert("normal")
}
increment = () => { // the assignment itself is unaffected
alert("arrow")
}
increment(); //prints arrow
Der Zuordnungsteil von var increment = ...erfolgt in beiden Fällen nach der angehobenen Funktion und varDeklaration. Unabhängig davon, wo Sie die function increment() { }Deklaration tatsächlich geschrieben haben , wird sie über die Zeile angehoben, die die Zuweisung zur incrementVariablen ausführt .
Aus diesem Grund funktioniert der folgende Code immer noch, obwohl die Funktion anscheinend nach ihrer Verwendung definiert wurde:
increment(); //prints normal
function increment(){
console.log("normal")
}
Wenn Sie Gleiches mit Gleichem vergleichen möchten, müssen Sie var increment = () => { ... }mit var increment = function () { ... }zwei Aufgaben vergleichen. Die Ergebnisse sehen folgendermaßen aus:
var increment = () => { console.log('arrow'); }
var increment = function () { console.log('normal'); }
increment(); # normal
vs.
var increment = function () { console.log('normal'); }
var increment = () => { console.log('arrow'); }
increment(); # arrow
In beiden Fällen gibt es eine einzige hochgezogene var increment;Deklaration, und dann erfolgen die Zuweisungen in der Reihenfolge, in der sie geschrieben wurden, was bedeutet, dass die letzte Zuweisung gewinnt.
Abgesehen davon ist dies einer der Hauptgründe, let x = () => { }um "alten" Funktionsdeklarationen vorzuziehen . letwird nicht gehisst, daher existiert die Funktion ab dem Zeitpunkt, den Sie natürlich erwarten würden, anstatt an die Spitze Ihres Bereichs zu springen.