¿Cómo mantener las expresiones de funciones de JavaScript en la memoria?

Nov 23 2020
let sayBye = function () {
    console.log(`Bye`);
}

let bye = sayBye;   
sayBye = null;    // X

bye();            // Y

Antes de hacer esta pregunta, busqué en google y encontré esta publicación.

Entonces pensé, antes de la línea X, la estructura es similar a esta:


sayBye ---------------                                              
                      |      
                      |  => function() {....}
                      |
bye-------------------

Después de la línea x, pensé que era así:

sayBye                        MEMORY                                      
                            
                      |  => function() {....}
                      |
bye-------------------

Pero cuando escribí adiós en las herramientas de desarrollo de Firefox, vi esto

¿Como es posible? Cuando escribí, ¿ let bye = sayBye;se copió el sayBye?

let sayBye = function () {
    console.log(`Bye`);
}

let bye = sayBye;   
sayBye = null;    // X

bye();            // Y

console.log(bye);

Respuestas

5 sp00m Nov 23 2020 at 17:53

Desde https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Inferred_function_names:

Las variables y los métodos pueden inferir el nombre de una función anónima a partir de su posición sintáctica (nuevo en ECMAScript 2015).

Tanto Chrome como Firefox ceden "sayBye"al imprimir bye.name.


A partir de experimentos personales, la consola Chrome muestra bye.toString()cuando se solicita bye, mientras que Firefox muestra una salida personalizada de ellos, donde muestran el nombre inferido de la función (lo que tiene sentido, ya que conocer el nombre generalmente ayuda a depurar).

3 RanjeetThorat Nov 23 2020 at 18:43

Las funciones son objeto, por lo que la asignación x = y no se copia. Probé este Nodejs que tengo

Bye
[Function: sayBye]

Si no nombra una función, JS le agregará un nombre automáticamente. En ES6 puede verificar el nombre de la función usando myFunction.name , es decir, 'nombre' es propiedad de un objeto de función. Lo importante es que esta es una propiedad de solo lectura . Una buena práctica es usar en constlugar de letusar la expresión de función. Además, si es posible, intente nombrar la función de depuración es fácil en la pila de llamadas

2 FZs Nov 23 2020 at 18:16

Está confundido por el nombre de la función.

Las cosas de la memoria suceden exactamente de la misma manera que pensaba.

Sin embargo, la función no tenía un nombre explícito, por lo que el navegador le dio un nombre implícito a la función, que es el nombre de la variable o propiedad del objeto a la que se asignó por primera vez, en este caso sayBye,.

Luego, se asigna a una variable diferente, pero el nombre no cambia.

Puede ver esto si le da un nombre explícito:

//  Explicit name ----vvvv
let sayBye = function myFn() {
    console.log(`Bye`);
}

let bye = sayBye;   
sayBye = null;    // X

bye();            // Y

console.log(bye);