An anderer Stelle ist ein Streit über die Terminologie einer benannten Funktion in CoffeeScript aufgetreten. Insbesondere hat sich jemand auf so etwas bezogen:
foo = ->
console.log("bar")
als benannte Funktion. Es wurde jedoch beanstandet, dass alles in CoffeeScript anonyme Funktionen sind und es keine benannten Funktionen gibt. Dies ist sicherlich richtig, CoffeeScript hat nur Funktionsausdrücke, die dann in einer Variablen gespeichert werden können. Aber ich denke nicht, dass es falsch ist, dies eine benannte Funktion zu nennen.
Aus meiner Sicht ist es eine benannte Funktion, weil es eine Funktion ist, der ein Name gegeben wurde. Es ist zwar keine benannte Funktion, so wie einige andere Sprachen benannte Funktionen haben, aber ich denke, es ist nah genug, dass es nicht unangemessen ist, es eine benannte Funktion zu nennen. Anders zu bestehen scheint nur ein Trottel zu sein.
Bin ich zum Mittagessen unterwegs und denke, dass das Beharren darauf, dass dies keine benannte Funktion ist, nur ein Trottel ist?
quelle
foo = ->
ist nur eine einfache alte Funktion, währendclass Foo
es sich um einen Konstruktor handelt. Ich sehe keinen Grund, warumfoo = ->
streng anonym genannt werden sollte.Antworten:
CoffeeScript ist untrennbar mit JavaScript verbunden, und JavaScript unterscheidet zwischen den folgenden Ausdrücken:
In der Tat können Sie sogar schreiben:
Da dieser Unterschied in JavaScript von Bedeutung ist, ist es sinnvoll, dieselben Begriffe zu verwenden, wenn über CoffeeScript gesprochen wird. CoffeeScript unterstützt jedoch nichts wie die
function foo ()
Syntax, sodass wir sagen können, dass es keine "benannten" Funktionen hat.In gewisser Weise ist der Name Teil der Funktionsdefinition in der
function foo() { ... }
, in dem anderen Fall erstellen Sie einfach eine Funktion und weisen sie einer Variablen zu. Dies spiegelt sich beispielsweise in der (nicht standardmäßigen)name
Eigenschaft von Funktionen wider : Im ersten Fall erhaltenfoo.name
Sie"foo"
und im zweiten Fall erhalten Sie""
.Darüber hinaus unterscheiden sich diese in JavaScript auch darin, wie sie in den Bereich eingeführt werden: Die erste Version wird "gehisst" und ist in ihrem gesamten Bereich verfügbar, wobei die zweite Definition erst verfügbar ist, nachdem sie zugewiesen wurde.
Stellen Sie sich das einfach als JavaScript-spezifischen Jargon vor, der auf CoffeeScript übertragen wird, weil CoffeeScript so eng mit JS verwandt ist.
quelle
function foo () {}
. Sie können jedoch weiterhin eine benannte Funktion über dasclass
Konstrukt initialisieren . Nur dass das kompilierte CoffeeScript (das resultierende JavaScript) viel ausführlicher ist, als die meisten eine benannte Funktion schreiben würden.foo
Der Körper Ihrer Funktion wird nicht angehoben.class foo
Funktionskörper wird nicht an den Anfang der Datei gehoben.Es ist erwähnenswert, dass der Benutzer ausdrücklich angegeben hat, dass er eine "anonyme Funktion in eine benannte Funktion" umwandelt. Beide Begriffe haben eine starke, vorhandene Bedeutung und insbesondere unterschiedliche Funktionen in der JavaScript-Welt. Angesichts der vorhandenen Bedeutung taten sie so etwas nicht, und ich wies darauf hin.
CoffeeScript ist nicht so weit von JavaScript entfernt, dass Sie Begriffe, die beide gemeinsam haben, neu definieren sollten, um etwas anderes in einer Sprache zu bedeuten. CoffeeScript existiert nicht in einer Blase, die aus der JavaScript-Implementierung entfernt wurde, so wie Sie vielleicht argumentieren, dass C ++ von Assembly getrennt ist. Es ist wichtig , den Unterschied zwischen einer anonymen Funktion und einer benannten Funktion zu kennen , denn wenn Sie erwarten, dass sich Ihre "benannte" CoffeeScript-Funktion wie eine tatsächlich benannte Funktion verhält , werden Sie enttäuscht sein:
Das entsprechende JavaScript würde mit einer echten benannten Funktion gut funktionieren:
Sie haben vielleicht Recht, dass ich nur "nitpicking" bin, aber was nun? Die subtilen Punkte in der Computerprogrammierung sind wichtig , und es ist wichtig, "technisch" korrekt zu sein. Es ist der Unterschied zwischen dem Schreiben von Code, der zufällig funktioniert, und dem tatsächlichen Verstehen, warum Ihr Code korrekt ist .
quelle
Nein . Denn in Bezug auf die Semantik, Ihre Funktionsreferenz wird in einer Variablen gespeichert, die Sie über eine Variable verweisen Namen .
quelle
Auf keinen Fall ein Trottel, imo. Ich benutze es ausgiebig für die Lesbarkeit:
Somit:
Echt benannte Funktion in "Coffeescript"
Sie entkommen reinem JS über den Backtick `
Beachten Sie, dass Sie Ihren Funktionskörper nicht einrücken können.
Prost
quelle
Verschwenden Sie keine Zeit damit, mit Pedanten zu streiten. Es ist niemals fruchtbar. Ja, jeder weiß, was Sie unter einer "benannten Funktion" in CoffeeScript verstehen, auch wenn diese technisch nicht korrekt ist. Nein, die Verwendung einer technisch inkorrekten, aber allgemein verständlichen Terminologie hat keinen Einfluss auf die Richtigkeit oder Unrichtigkeit der vorgeschlagenen Lösung. Ist es möglich, präziser zu sein, ohne sich umständlich zu formulieren? Wahrscheinlich nicht. Das bedeutet jedoch nicht, dass die Leute es abrutschen lassen. Stellen Sie sich diesen Kerl am anderen Ende des Gesprächs vor.
Der Grund, warum es technisch nicht korrekt ist, ist, dass Sie die Funktion nicht benannt haben, sondern einen Verweis auf die Funktion benannt haben. Erwägen:
Wie heißt die Funktion?
foo
undbar
beide verweisen auf dieselbe Funktion, haben jedoch unterschiedliche Namen. Entweder kannfoo
oderbar
kann jederzeit neu zugewiesen werden, um auf eine andere Funktion oder sogar einen anderen Typ insgesamt zu verweisen, ohne die Funktion selbst zu ändern.quelle
So lese ich das:
Wenn Sie eine Funktion in einer JavaScript-Konsole mit deklarieren
und dann
foo
ohne Klammern aufrufen , wird zurückgegebenWenn Sie es jedoch mit definieren
und dann
foo
ohne Klammern erneut aufrufen , wird zurückgegebenIm ersten Fall würde ich sagen, dass Sie eine Variable mit dem Namen "foo" deklarieren, in der eine anonyme Funktion gespeichert ist. Im zweiten Fall würde ich sagen, dass Sie tatsächlich eine benannte Funktion namens "foo" deklarieren.
Da CoffeeScript das erste Muster verwendet, stimme ich zu, dass es technisch korrekt ist, dass die Funktionen von CoffeeScript alle anonymen Funktionen sind, die in benannten Variablen gespeichert werden.
quelle