381 Stimmen

Kann ich die Pfeilfunktionssyntax von ES6 mit Generatoren verwenden? (Pfeilnotation)

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.)

360voto

Kann ich die Pfeilfunktionssyntax von ES6 mit Generatoren verwenden?

Leider kannst du das nicht.

Laut MDN

Die function*-Anweisung (Schlüsselwort function 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 "}"

167voto

CoderPi Punkte 12423

Der Unterschied zwischen Inline-Funktionen und Pfeilfunktionen

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 oder new.target). Pfeilfunktionen sind immer anonym.

Weitere Details finden Sie hier


Warum Pfeilfunktionen nicht als Generatoren verwendet werden können

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.


Warum Pfeilfunktionen kein yield verwenden können

http://tc39wiki.calculist.org/es6/arrow-functions/

Pfeilfunktionen binden this lexikalisch, binden return im Fall des Block-Körpers, sodass es aus der unmittelbar umgebenden Pfeilfunktion zurückgibt, und schließen break und continue 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.

63voto

monk-time Punkte 1794

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.

12voto

Bhojendra Rauniyar Punkte 78146

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.

11voto

Gourav Makhija Punkte 630

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.com

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.

Powered by:

X