Esto no tiene nada que ver con las funciones de flecha. Por el contrario, las funciones regulares (y vardeclaraciones) son izadas ; independientemente de dónde los escriba, se moverán a la parte superior de su alcance. Efectivamente, ambos ejemplos de código son completamente idénticos, y se ven así:
var increment; // hoisted
function increment() { // hoisted
alert("normal")
}
increment = () => { // the assignment itself is unaffected
alert("arrow")
}
increment(); //prints arrow
La parte de asignación de var increment = ...ocurre después de la función izada y la vardeclaración, en ambos casos. Independientemente de dónde escribió realmente la function increment() { }declaración, se eleva por encima de la línea que realiza la asignación a la incrementvariable.
Es por eso que el siguiente código aún funciona, a pesar de que la función aparentemente se define después de ser utilizada:
increment(); //prints normal
function increment(){
console.log("normal")
}
Si desea comparar like con like, debe comparar var increment = () => { ... }con var increment = function () { ... }, es decir, dos tareas. Los resultados se ven así:
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
En ambos casos, hay una sola var increment;declaración de izado , y luego las asignaciones ocurren en el orden en que están escritas, lo que significa que gana la última asignación.
Por otro lado, esta es una de las principales razones para preferir let x = () => { }a las declaraciones de funciones de estilo "antiguo". letno está izado, por lo que la función existe desde el momento en que lo esperarías naturalmente, en lugar de saltar a la parte superior de tu alcance.