Considere el siguiente código.
const foo = () => {};
console.log(foo.name); // prints foo
const bar = foo;
console.log(bar.name); // prints foo again
Por favor, señale lo que está mal con mi razonamiento sobre la declaración const foo = () => {}; . La expresión () => {} se evalúa como un objeto de función anónimo y la declaración vincula el nombre foo a ese objeto. Seguramente el valor de la expresión () => {} no sabe que tiene el name foo , pero de alguna manera sabe que después de que foo está vinculado a él. Pero, ¿cómo sucedió eso? Supongo que = no altera el lado derecho y las líneas 3 y 4 se comportan como esperaba.
De acuerdo con la especificación, cuando se evalúa una declaración de variable y el inicializador es una definición de función anónima, entonces esa definición se evalúa de una manera especial, pasando el nombre de la variable que se utilizará como nombre de función:
LexicalBinding : BindingIdentifier Inicializador
1. Deje que bindingId sea StringValue de BindingIdentifier .
2. ¡Que sea lhs ! ResolveBinding ( bindingId ).
3. Si IsAnonymousFunctionDefinition ( Inicializador ) estrue, entonces
a. Sea el valor? NamedE Evaluation of Initializer con el argumento bindingId .
...
Algo similar sucede al evaluar una expresión de asignación.
La línea 1 de su código técnicamente no es una función anónima, es una expresión de función "nombrada implícitamente" (o como también la llama el mdn, una "función sin nombre").
Desde el mdn:
La variable a la que se asigna la expresión de la función tendrá una propiedad de nombre. El nombre no cambia si se asigna a una variable diferente. Si se omite el nombre de la función, será el nombre de la variable (nombre implícito). Si el nombre de la función está presente, será el nombre de la función (nombre explícito). Esto también se aplica a las funciones de flecha (las flechas no tienen nombre, por lo que solo puede dar a la variable un nombre implícito).
Ver también: Función.nombre#función_expresión