¿Por qué esto registra 1? Es confuso para mí, ¿alguien puede explicar por favor?
(function(){ var hello = () => { console.log(1); } function hello () { console.log(2); } return hello() })()Declaraciones de funciones (las declaraciones que comienzan con function functionName( ) se elevan a la parte superior de su ámbito adjunto y se asignan primero a su identificador de nombre de función, antes de que cualquier otra cosa se ejecute en ese ámbito. Las asignaciones con = no.
El hecho de que sea una función de flecha no importa particularmente: una asignación de function en el mismo punto produciría los mismos resultados.
(function(){ var hello = function() { console.log(1); } function hello () { console.log(2); } return hello() })()Su código es equivalente a
(function(){ // hello identifier gets created at the very beginning var hello; // hoisted function declaration assigns to `hello`: hello = function hello () { console.log(2); } // assignment with =, not hoisted, assigns to `hello` hello = () => { console.log(1); } return hello() })() Recomendaría usar la sintaxis ES2015+ al menos, lo que ayudará a evitar que cometa este tipo de accidentes: prohibirá las redeclaraciones de variables si usa let o const .
(function(){ let hello = () => { console.log(1); } function hello () { console.log(2); } return hello() })()Porque:
var .var para un enlace que ya existe no es un errorEntonces, su código está creando un enlace, asignándole la función declarada y luego sobrescribiendo ese valor con la función de flecha. En efecto:
(function(){ // Declaration of the var-scoped binding happens first var hello; // Then the function declaration is processed, assigning // the function to the binding hello = function hello() { console.log(2); }; // Then the step-by-step code begins and processes // the assignment hello = () => { console.log(1); }; return hello(); })(); Nota al margen: var está efectivamente en desuso, no hay razón para usarlo en el código moderno. En su lugar, use let o const . Tienen un comportamiento más racional:
let o const que entraría en conflicto con una declaración de estilo var como una declaración de función)var global y no crean propiedades en el objeto global. Su ejemplo le habría dado un error agradable y útil con let o const :
(function(){ let hello = () => { console.log(1); }; function hello () { console.log(2); } return hello(); })()