Warum haben anonyme Funktionen in Javascript Namen?

8

Ich lese ein tolles Buch namens "Secrets of the JavaScript Ninja" von John Resig & amp; Bär Bibeaoult. In Kapitel 3.2 gibt es ein Beispiel;

%Vor%

Dann heißt es;

  

Eine anonyme Funktion wird erstellt und einer globalen Variablen namens canFly zugewiesen. Aufgrund der funktionalen Eigenschaft von JavaScript kann die Funktion über diese Referenz als canFly () aufgerufen werden. In dieser Hinsicht ist es fast funktional, eine benannte Funktion namens "canFly" zu deklarieren, aber nicht ganz. Ein wichtiger Unterschied besteht darin, dass die Namenseigenschaft der Funktion "", nicht "canFly" lautet.

Wenn ich jedoch versuche, das Beispiel in den Developer Tools von Chrome auszuführen und die Eigenschaft name der Funktion canFly zu überprüfen, wird der Wert "canFly" anstelle einer leeren Zeichenfolge zurückgegeben.

%Vor%

Haben anonyme Funktionen, die Variablen zugewiesen wurden, in früheren Tagen keine Namen? Wenn ja, was hat sich geändert? Oder haben die Autoren einen Fehler gemacht?

    
Yusuf Yalim 17.07.2017, 14:37
quelle

2 Antworten

2

Theoretisch sind anonyme Funktionen anomymous, dh namenlos. So wurde es ursprünglich umgesetzt und für mehr als zehn Jahre war damit alles in Ordnung.

Dann passierten zwei Dinge: die gesamte Web2.0 / ajax-Bewegung, bei der Leute mit der Implementierung von UI-Funktionen begannen, die häufig in Desktop-Apps in Webseiten und node.js zu finden sind. Diese zwei in der Kombination gezwungen mehr und mehr Entwickler, Javascript als eine ernsthafte Sprache zu behandeln und sobald Leute sich mit Javascript vertraut gemacht haben, fingen sie an, wirklich große Codebasen zu schreiben.

Dies führte zu Beschwerden über die Debuggability von Javascript. Es gab zahlreiche, die keinen nützlichen Debugger hatten (was uns zu wirklich guten Debuggern in Browsern führte, die meiner Meinung nach zweitbeste nur für MS Visual Studio sind), um nicht zu wissen, aus welcher Funktion ein console.log kommt (weil sie anonym sind) .

Dies führte dazu, dass Browser- und JS-Engine-Entwickler Code implementieren, der versucht, den "Namen" namenloser Funktionen zu erraten.

Theoretisch ist diese Funktion falsch, weil Sie nicht immer garantieren können, dass der Name, den Sie erraten, so ist, wie die Funktion aufgerufen wird (zB wenn die Funktion mehreren verschiedenen Variablen zugewiesen ist). In der Praxis ist etwas, das 90% der Zeit funktioniert, besser als gar nichts.

    
slebetman 17.07.2017, 15:12
quelle
1

Hier ist eine leicht abgewandelte Version Ihres Testcodes, die einen Hinweis darauf gibt, dass .name gerade versucht, wirklich schwer zu sein, hilfreich zu sein:

%Vor%

Unter MDN können wir nach Details suchen war eine nicht standardmäßige Eigenschaft:

  

Die Eigenschaft function.name gibt den Namen der Funktion zurück.

... das seinen Weg in ES2015 gefunden hat (Hervorhebung von mir):

  

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

Also gibt es den Namen zurück, aber wenn es nicht möglich ist, versucht es zu raten.

    
Álvaro González 17.07.2017 15:13
quelle