Wie kann man JavaScript-Funktionsausdrücke im Speicher behalten?
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
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).
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 const
anstelle des let
Funktionsausdrucks zu verwenden. Wenn möglich, versuchen Sie auch, das Debuggen von Funktionen zu benennen
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);