2017-07-17 6 views
8

Ich lese ein tolles Buch namens "Secrets of the JavaScript Ninja" von John Resig geschrieben & Bär Bibeaoult. In Kapitel 3.2 gibt es ein Beispiel;Warum haben anonyme Funktionen in Javascript Namen?

var canFly = function(){ return true; }; 

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 ist, dass die name-Eigenschaft der Funktion "", nicht "canFly" ist.

Aber wenn ich versuche, das Beispiel auf Chrome Developer Tools auszuführen und die name Eigenschaft der canFly Funktion zu überprüfen, gibt es den Wert „canFly“ statt eine leere Zeichenfolge.

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

+1

Ich kann mich nicht erinnern, wo ich es gelesen habe, aber ich erinnere mich zu lesen, dass in neuen Versionen von Node/V8 sogar anonyme Funktionen, wenn sie einer Variablen zugewiesen werden, den Variablennamen erhalten. Wird eine Antwort posten, wenn ich einen Link finde. – Aron

+9

[* Abgeleitete Funktionsnamen *: Variablen und Methoden können den Namen einer anonymen Funktion von ihrer syntaktischen Position ableiten (neu in ECMAScript 2015)] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referenz/Global_Objects/Funktion/Name # Inferred_Funktionsnamen) –

+1

Da sind wir. Danke @AlexK. – Aron

Antwort

2

Theoretisch sind anonyme Funktionen anomym, dh namenlos. So wurde es ursprünglich umgesetzt und seit mehr als zehn Jahren ging es allen gut.

Dann geschahen zwei Dinge: die gesamte Web2.0/Ajax-Bewegung, bei der Leute mit der Implementierung von UI-Funktionen begannen, die häufig in Desktop-Anwendungen in Webseiten und node.js zu finden sind. Diese zwei in der Kombination zwangen immer mehr Entwickler, Javascript als eine ernsthafte Sprache zu behandeln und sobald Leute sich mit Javascript vertraut machten, 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 (wenn die Funktion beispielsweise mehreren Variablen zugewiesen ist). In der Praxis ist etwas, das zu 90% funktioniert, besser als gar nichts.

+1

Interessanterweise wurde John Resigs Buch im Jahr 2008 veröffentlicht, so dass wir einen ungefähren Zeitrahmen zwischen 2008 und 2017 für die Implementierung dieses Features angeben können. Ich glaube, wenn Sie wirklich neugierig sind, können Sie den Quellcode der verschiedenen js-Engines für Code-Commits durchsuchen. Apples Javascriptcore (Nitro), Googles V8 und Microsofts Chakracore sind Open Source. – slebetman

+0

Vielen Dank! Sieht so aus, als müsste ich C/C++ lernen, um Quellcode von Browser-Engines zu verstehen, aber ich denke, es ist ein Muss, um ein tieferes Verständnis der Antwort auf meine Frage zu bekommen und wie JS tatsächlich hinter Szenen arbeitet. –

1

Hier ist eine leicht gezwickt Version Ihres Test-Code, der einen Anhaltspunkt gibt, dass .name kann nur wirklich hart versuchen, hilfreich zu sein:

var canFly = function() {}; 
 
var areYouSure = function yesIAm(){}; 
 
console.log(canFly.name); 
 
console.log(areYouSure.name); 
 
console.log((function(){}).name);

Überprüfung auf Details bei MDN können wir sehen, Es war eine nicht standardmäßige Eigenschaft:

Die function.name-Eigenschaft gibt die zurück Name der Funktion

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

Variablen und Methoden den Namen einer anonymen Funktion von seiner syntaktischen Position (neu in ECMAScript 2015) ableiten kann.

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

+0

Danke! Dies bedeutet, dass anonyme Funktionen nur dann eine leere name-Eigenschaft haben, wenn sie keiner Variablen zugewiesen wurden. –

Verwandte Themen