¿Puedo usar la sintaxis de la función de flecha de ES6 con generadores? (notación de flecha)
Es decir, ¿cómo expreso
function *(next) {}
con sintaxis de flecha? Probé todas las combinaciones que se me ocurrieron y no encuentro ninguna documentación al respecto.
(Actualmente estoy usando Node.js v0.11.14).
¿Puedo usar la sintaxis de la función de flecha de ES6 con generadores?
No puedes. Lo siento.
Según MDN
La
function*
declaración (function
palabra clave seguida de un asterisco) define una función generadora.
De un documento de especificaciones (énfasis mío):
La sintaxis de la función se amplía para agregar un
*
token opcional:
FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")"
"{" FunctionBody "}"
La diferencia entre funciones en línea y funciones de flecha
En primer lugar, las funciones Arrow () => {}
no están diseñadas para reemplazar las funciones Inline function(){}
y son diferentes. Las funciones en línea son simplemente funciones, por lo que la pregunta es cuál es la diferencia entre las funciones de flecha y las funciones en línea.
Una expresión de función de flecha (también conocida como función de flecha) tiene una sintaxis más corta en comparación con las expresiones de función y no vincula sus propias expresiones
this
(arguments
,,super
onew.target
). Las funciones de flecha son siempre anónimas.
Algunos detalles más rápidos aquí
Por qué la función Arrow no se puede utilizar como generador
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Uso de la palabra clave de rendimiento
La palabra clave rendimiento no se puede utilizar en el cuerpo de una función de flecha (excepto cuando se permita dentro de funciones anidadas dentro de ella). Como consecuencia, las funciones de flecha no se pueden utilizar como generadores.
Tenga en cuenta que los generadores sin ellos yield
no tienen sentido.
Por qué la función Arrow no puede utilizar el rendimiento
http://tc39wiki.calculist.org/es6/arrow-functions/
Las funciones de flecha se vinculan
this
léxicamente, se vinculanreturn
en el cuerpo del bloquebreak
para que regrese de la función de flecha inmediatamente circundante y excluyen ycontinue
hacen referencia a declaraciones fuera de la función de flecha inmediatamente circundante.La expresión principal del Identificador
arguments
no se puede utilizar en el cuerpo de una función de flecha (ya sea en forma de expresión o de bloque).Asimismo,
yield
no se puede utilizar en el cuerpo de una función de flecha. Las flechas no pueden ser generadoras y no queremos continuaciones profundas.
El rendimiento en una función de flecha arrojará un error semántico: http://www.ecma-international.org/
Al final, la razón está en la profunda complejidad en la implementación de ECMA6. C# tampoco permite esto por razones similares .