Wie kann man JavaScript-Funktionsausdrücke im Speicher behalten?

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

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

bye();            // Y

Bevor ich diese Frage stellte, suchte ich in Google und fand diesen Beitrag.

Dann dachte ich, vor Zeile X die Struktur ähnlich wie folgt:


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

Nach der x-Linie dachte ich, dass es so ist:

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

Aber als ich in Firefox-Entwicklertools Tschüss schrieb, sah ich das

Wie ist es möglich? Wenn ich schrieb, let bye = sayBye;ist das sayBye kopiert?

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

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

bye();            // Y

console.log(bye);

Antworten

5 sp00m Nov 23 2020 at 17:53

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

Variablen und Methoden können den Namen einer anonymen Funktion aus ihrer syntaktischen Position ableiten (neu in ECMAScript 2015).

Chrome und Firefox geben beide "sayBye"beim Drucken bye.name.


Aus persönlichen Experimenten geht hervor, dass die Chrome-Konsole auf bye.toString()Anfrage zeigt bye, während Firefox eine benutzerdefinierte Ausgabe von ihnen anzeigt, in der der abgeleitete Name der Funktion angezeigt wird (was in der Tat sinnvoll ist, da das Wissen um den Namen normalerweise beim Debuggen hilft).

3 RanjeetThorat Nov 23 2020 at 18:43

Funktionen sind Objekte, daher wird die Zuordnung x = y nicht kopiert. Ich habe diese Nodejs ausprobiert, die ich bekommen habe

Bye
[Function: sayBye]

Wenn Sie keine Funktion benennen, fügt JS ihr automatisch einen Namen hinzu. In ES6 können Sie den Namen der Funktion mithilfe von myFunction.name überprüfen , dh 'name' ist die Eigenschaft eines Funktionsobjekts. Wichtig ist, dass dies eine schreibgeschützte Eigenschaft ist. Es wird empfohlen, die Funktion constanstelle des letFunktionsausdrucks zu verwenden. Wenn möglich, versuchen Sie auch, das Debuggen von Funktionen zu benennen

2 FZs Nov 23 2020 at 18:16

Der Name der Funktion verwirrt Sie.

Die Erinnerungssachen passieren genau so, wie Sie gedacht haben.

Die Funktion hatte jedoch keinen expliziten Namen, daher gab der Browser der Funktion einen impliziten Namen , dh den Namen der Variablen- oder Objekteigenschaft , der sie in diesem Fall zuerst zugewiesen wurde sayBye.

Dann wird es einer anderen Variablen zugewiesen, aber der Name ändert sich nicht.

Sie können dies sehen, wenn Sie ihm einen expliziten Namen geben:

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

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

bye();            // Y

console.log(bye);