Comment conserver les expressions de fonction JavaScript en mémoire?

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

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

bye();            // Y

Avant de poser cette question, j'ai cherché dans google et j'ai trouvé ce post.

Ensuite, j'ai pensé, avant la ligne X, la structure similaire à celle-ci:


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

Après la ligne x, je pensais que c'était comme ça:

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

Mais quand j'ai écrit au revoir dans les outils de développement Firefox, j'ai vu ceci

Comment est-ce possible? Quand j'ai écrit, let bye = sayBye;le sayBye est-il taillé?

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

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

bye();            // Y

console.log(bye);

Réponses

5 sp00m Nov 23 2020 at 17:53

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

Les variables et méthodes peuvent déduire le nom d'une fonction anonyme à partir de sa position syntaxique (nouveau dans ECMAScript 2015).

Chrome et Firefox donnent tous deux "sayBye"lors de l'impression bye.name.


À partir d'expériences personnelles, la console Chrome s'affiche bye.toString()lors de la demande bye, tandis que Firefox affiche une sortie personnalisée de la leur, où ils affichent le nom déduit de la fonction (ce qui est en effet logique, car connaître le nom aide généralement au débogage).

3 RanjeetThorat Nov 23 2020 at 18:43

Les fonctions sont objet, donc l'affectation x = y n'est pas copiée. J'ai essayé ce Nodejs que j'ai

Bye
[Function: sayBye]

Si vous ne nommez pas une fonction, JS lui ajoutera automatiquement un nom. Dans ES6, vous pouvez vérifier le nom de la fonction en utilisant myFunction.name , c'est-à-dire que 'nom' est la propriété d'un objet fonction. L'important est qu'il s'agit d' une propriété en lecture seule . La bonne pratique consiste à utiliser constau lieu de lettout en utilisant l'expression de fonction. De plus, si possible, essayez de nommer le débogage de fonction est facile sur la pile d'appels

2 FZs Nov 23 2020 at 18:16

Vous êtes confus par le nom de la fonction.

Les choses de mémoire se déroulent exactement de la même manière que vous le pensiez.

Cependant, la fonction n'avait pas de nom explicite, le navigateur a donc donné un nom implicite à la fonction, c'est-à-dire le nom de la variable ou de la propriété d'objet à laquelle elle a été affectée en premier , dans ce cas sayBye,.

Ensuite, il est affecté à une variable différente, mais le nom ne change pas.

Vous pouvez voir cela si vous lui donnez un nom explicite:

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

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

bye();            // Y

console.log(bye);