Das heißt, wie drücke ich aus
function *(next) {}
mit Pfeil-Syntax? Ich habe alle Kombinationen ausprobiert, die mir einfielen, und ich konnte keine Dokumentation dazu finden.
(Ich benutze derzeit Node.js v0.11.14.)
Das heißt, wie drücke ich aus
function *(next) {}
mit Pfeil-Syntax? Ich habe alle Kombinationen ausprobiert, die mir einfielen, und ich konnte keine Dokumentation dazu finden.
(Ich benutze derzeit Node.js v0.11.14.)
Kann ich die Pfeilfunktionssyntax von ES6 mit Generatoren verwenden?
Leider kannst du das nicht.
Laut MDN
Die
function*
-Anweisung (Schlüsselwortfunction
gefolgt von einem Sternchen) definiert eine Generatorfunktion.
Aus einem Spezifikationsdokument (meine Hervorhebung):
Die Syntax der Funktionsdeklaration wird erweitert, um ein optionales
*
-Token hinzuzufügen:
FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")"
"{" FunctionBody "}"
Zunächst einmal sind Pfeilfunktionen () => {}
nicht dazu gedacht, Inline-Funktionen function(){}
zu ersetzen, sondern sie sind unterschiedlich. Inline-Funktionen sind einfach Funktionen, also lautet die Frage, was der Unterschied zwischen Pfeilfunktionen und Inline-Funktionen ist.
Ein Pfeilausdruck (auch bekannt als Pfeilfunktion) hat eine kürzere Syntax im Vergleich zu Funktionsausdrücken und bindet nicht ihr eigenes
this
,arguments
,super
odernew.target
). Pfeilfunktionen sind immer anonym.
Weitere Details finden Sie hier
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Verwendung des yield-Schlüsselworts
Das Schlüsselwort yield darf nicht im Körper einer Pfeilfunktion verwendet werden (außer wenn es in Funktionen erlaubt ist, die weiter unten verschachtelt sind). Als Folge können Pfeilfunktionen nicht als Generatoren verwendet werden.
Beachten Sie, dass Generatoren ohne yield
keinen Sinn ergeben.
http://tc39wiki.calculist.org/es6/arrow-functions/
Pfeilfunktionen binden
this
lexikalisch, bindenreturn
im Fall des Block-Körpers, sodass es aus der unmittelbar umgebenden Pfeilfunktion zurückgibt, und schließenbreak
undcontinue
aus, die auf Anweisungen außerhalb der unmittelbar umgebenden Pfeilfunktion verweisen.Der primäre Ausdruck Identifier
arguments
darf nicht im Körper einer Pfeilfunktion verwendet werden (egal ob als Ausdruck oder Blockform).Ebenso darf
yield
nicht im Körper einer Pfeilfunktion verwendet werden. Pfeile können keine Generatoren sein und wir möchten keine tiefen Fortsetzungen.
Ein Yield in einer Pfeilfunktion führt zu einem semantischen Fehler: http://www.ecma-international.org/
Letztendlich liegt der Grund in der tiefen Komplexität bei der Implementierung von ECMA6. C# erlaubt dies auch nicht aus ziemlich ähnlichen Gründen.
Abgesehen von der Diskussion auf esdiscuss.org und den ECMA TC39 Sitzungsnotizen zu ES6 vom November 2013 erwähnt oben wurden Generatorenpfeile in zwei September 2016 ES7 Sitzungen erneut besprochen [1] [2]. Nach einer Diskussion über Vor- und Nachteile verschiedener Syntaxe (hauptsächlich =*>
und =>*
) und einem Mangel an Rechtfertigungen und Anwendungsfällen für dieses Feature kamen sie zu dem Schluss, dass:
- Es besteht Interesse seitens des Gremiums, aber die Befürchtung, dass das Feature nicht ausreichend Gewicht hat, um eine neue Syntax hinzuzufügen
- Plan, am dritten Tag erneut zu überprüfen, ob wir
=>*
zumindest auf Stufe 0 bringen können, als Teil von [Domenic Denicola]'s async Iteration Vorschlag
Der Vorschlag für Generatoren-Pfeile wurde auf Stufe 1 mit Brendan Eich und Domenic Denicola als Vertreter verschoben. Asynchrone Iteration erwähnt oben wurde abgeschlossen und implementiert in 2018.
Im Oktober 2019 ist ein offizielles Repository von Sergey Rubanov aufgetaucht mit weiteren Diskussionen über Syntax und andere Details.
Ich hatte auch dieselbe Frage und bin hierher gekommen. Nachdem ich die Beiträge und Kommentare gelesen habe, hatte ich das Gefühl, dass die Verwendung von Generatoren in einer Pfeilfunktion unklar erscheint:
const generator = () => 2*3; // * impliziert Multiplikation
// also wäre dies verwirrend
const generator = () =>* something; // äh, multiplizieren?
const generator = () =*> ... // äh, ^^
const generator = ()*=> ... // äh, *=3, immer noch multiplizieren?
const generator=*()=> ... // äh, ^^
const generator = *param => ... // äh, "param" ist kein festes Wort
Dies ist vielleicht der Hauptgrund, warum sie den Generator in Bezug auf Pfeilfunktion nicht implementiert haben.
Aber, wenn ich einer von ihnen wäre, könnte ich so denken:
const generator = gen param => ... // hmm, gen deutet auf einen Generator hin
const generator = gen () => ... // ^^
Dies fühlt sich genauso an wie eine asynchrone Funktion:
const asyncFunction = async () => ... // ziemlich cool
Weil bei normalen Funktionen das async Schlüsselwort existiert, nutzt die Pfeilfunktion es - async () =>
wird wahrscheinlich wie async function()
erscheinen.
Aber es gibt kein Schlüsselwort wie gen
oder generator
und leider nutzt die Pfeilfunktion es nicht.
Zusammenfassend:
Auch wenn sie den Generator in die Pfeilfunktion implementieren möchten, denke ich, dass sie über die Generator-Syntax im Kern-JavaScript nachdenken müssen:
generator function myfunc() {}
// anstatt
function* myfunc() {} // oder function *myfunc() {}
Und das wäre ein großer Fehler. Also, die Pfeilfunktion vom Generator fernzuhalten, ist ziemlich cool.
Nach @Bergi Kommentar:
Nein. Pfeilfunktionen sollen leichtgewichtig sein (und haben z.B. kein .prototype) und sind oft Einzeiler, während Generatoren ziemlich das Gegenteil sind.
Ich würde sagen, dass der Zweck eines Generators laufen-stoppen-laufen ist und daher glaube ich nicht, dass wir uns um Prototype, lexikalisches this, usw. kümmern müssen.
Derzeit ist dies nicht möglich, aber in Zukunft könnte es möglich sein, denn das TC39 hat im Oktober 2019 einen Vorschlag dazu veröffentlicht, der sich im Stadium 1 befindet.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.