Warum hat ES6 keine Dünnpfeil-Funktionen?

16

ES6 hat Fettpfeil- Funktionen ( =>) hinzugefügt , die zwei Hauptunterschiede zu normalen Funktionen aufweisen:

  • kürzere Syntax (einschließlich impliziter Rückgabe, wenn Sie einen Body mit einem Ausdruck verwenden)
  • thisvom umgebenden Bereich erben

Beides sind sehr nützliche Funktionen, aber sie scheinen mir in Wert und Anwendung völlig getrennt zu sein - manchmal möchte ich die eine oder die andere oder beide oder keine. Es scheint seltsam , dass , wenn ich eine kurze Syntax Funktion verwenden möchten, ich habe auch die Verwendung this-modifying Verhalten. Und umgekehrt. Ich verstehe nicht, warum diese beiden Funktionen als einzelne Erweiterung der Sprache implementiert sind.

Was ist, wenn ich eine kurze Syntaxfunktion für ihre implizite Rückgabe und Kürze verwenden function (..) { return ...}möchte (in einem Kontext, in dem ein vollständiger Code etwas weniger lesbar wäre), aber ich möchte thisin meiner Funktion auf den aufrufenden Kontext verweisen? Es gibt keine Möglichkeit, dies zu tun.

CoffeeScript hat sowohl ->als auch =>Stilfunktionen, und anscheinend hat ES6 den =>Stil von dort ausgeliehen. Meine Frage ist also, warum hat ES6 den ->Stil nicht auch ausgeliehen ?

callum
quelle
Fat-Arrow-Funktionen haben andere Unterschiede, als wenn sie auch nicht binden könnten arguments.
DeadMG
Wenn zuweilen nur der umgebende Gültigkeitsbereich gewünscht wird, können Sie jederzeit thiseine vollständige Funktionsdeklaration an den Abschluss binden . Dies ist jedoch möglicherweise nicht der Teil, um den Sie sich Sorgen machen.
Ben

Antworten:

25

Siehe den Vorschlag zum Hinzufügen von Pfeilfunktionen: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax 1

Was es sagt, ist:

Wir wollen jedoch keine CoffeeScript's ->, es ist verwirrend, zwei Pfeile zu haben, und dynamisch ist diese Bindung eine häufig abgefeuerte Fußwaffe.

Sie können auch eine Diskussion über eine frühere Version des Vorschlags sehen, die ebenfalls die Syntax -> hatte: https://esdiscuss.org/topic/arrow-function-syntax-simplified

Es scheint sich um Folgendes zu handeln:

  1. Zwei Pfeilsyntaxen mit subtil unterschiedlicher Semantik würden die Komplikation und Verwirrung erhöhen.
  2. Die Dynamik dieser Funktionsbindung () und ->eine als selten nützlich erachtete Fußwaffe.
  3. Wenn Sie diese Bindung wirklich dynamisch benötigen, können Sie function () weiterhin verwenden, da eine Verknüpfungssyntax nicht sehr hilfreich war.
Winston Ewert
quelle
1
+1. Beachten Sie insbesondere, dass ES6 der zweite Versuch ist, diese Funktionen einzuführen, die ursprünglich für die Aufnahme in ES4 geplant waren. Die Spezifikation wurde jedoch aufgegeben, als sich herausstellte, dass die wichtigsten Stakeholder der Meinung waren, dass sie zu komplex sind und wahrscheinlich die Abwärtskompatibilität beeinträchtigen. Diesmal muss es für das Komitee ein wichtiges Ziel gewesen sein, alles so einfach wie möglich zu halten.
Jules
1
Vielen Dank für Ihre Antwort, aber ich glaube nicht, dass es das verdeckt. Weniger bedeutet nicht einfacher; Ich würde argumentieren, dass es komplexer ist, zwischen zwei sehr unterschiedlichen Funktionssyntaxen zu wechseln, um eine andere Bindungslogik zu erhalten (im Vergleich zum Umschalten eines einzelnen Zeichens). Es ist keine schreckliche Idee, "mehrere Arten von Funktionen mit unterschiedlicher Semantik" zu haben. es ist genau das, was wir tatsächlich haben. Und ich verstehe nicht, was Abwärtskompatibilität mit irgendetwas zu tun hat, von dem wir sprechen. Ich schlage nicht vor, dass sie die Unterstützung für die klassische Funktionssyntax entfernt haben sollten, wenn Sie das meinen
Callum
2
@ Callum, der Konsens (zumindest unter den Leuten, die diese Entscheidung treffen) ist, dass function()diese Bindung ein Fehler war und eine Warze auf die Sprache ist. Wenn sie könnten, würden function()sie die =>Semantik ändern , aber sie können nicht, weil dies die Abwärtskompatibilität stören würde.
Winston Ewert
2
@ WinstonEwert Moment, sagen Sie, die Leute, die die Entscheidung treffen, hätten es vorgezogen, wenn sie sich ändern könnten function(), um thisvom umgebenden Bereich zu erben, wie es der =>Fall ist? Würden Sie in diesem Fall nicht thisüberall auf das globale Objekt verweisen? Klingt komisch. Wo hast du das gehört?
Callum
3
Dies mag eine akzeptierte Antwort haben, aber es scheint ein schlechtes Sprachdesign zu sein. Wenn Sie eine Sprache haben, die einen fetten Pfeil erfordert, sollte auch ein dünner Pfeil verfügbar sein. Ersteres zwingt jeden dazu, in Bezug auf Objekte zu denken, während letzteres zuerst die Geschichte des funktionalen Designs und den zurückgestellten Kontext anerkennt.
Core