sintaxis funciones funcion flecha example ecmascript anonimas javascript node.js ecmascript-6 generator arrow-functions

javascript - funciones - sintaxis funcion flecha



¿Puedo usar la sintaxis de la función de flecha de ES6 con generadores?(notación de flecha) (6)

¿Puedo usar la sintaxis de la función de flecha de ES6 con generadores?

No puedes Lo siento.

De acuerdo con MDN

La instrucción function* (palabra clave de function seguida de un asterisco) define una función generadora.

De un documento de especificaciones (mi énfasis):

La sintaxis de la función se extiende para agregar un token * opcional:

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" "{" FunctionBody "}"

es decir, cómo expreso esto:

function *(next) {}

con flechas He probado todas las combinaciones que se me ocurrieron, y no puedo encontrar ninguna documentación al respecto.

(actualmente usando el nodo v0.11.14)


La diferencia entre las funciones en línea y las funciones de flecha

En primer lugar Arrow-functions () => {} no están hechas para reemplazar la función de 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 se new.target this , arguments , super o new.target ). Las funciones de flecha son siempre anónimas.

Algunos detalles más rápidos here

Por qué la función de flecha no se puede usar como generador

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Uso de la palabra clave de rendimiento

La palabra clave de yield no se puede usar en el cuerpo de una función de flecha (excepto cuando se permite dentro de funciones anidadas dentro de ella). Como consecuencia, las funciones de flecha no pueden usarse como generadores.

Tenga en cuenta que los MDN sin yield no tienen sentido.

Por qué la función de flecha no puede usar el rendimiento

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

Las funciones de flecha vinculan this léxicamente, vinculan el return en el caso del cuerpo del Bloque para que regrese de la función de flecha que encierra inmediatamente, e impiden la break y continue haciendo referencia a declaraciones fuera de la función de flecha que encierra inmediatamente.

Los arguments expresión primaria del identificador no pueden usarse en el cuerpo de una función de flecha (ya sea expresión o forma de bloque).

Del mismo modo, el yield no puede usarse en el cuerpo de una función de flecha. Las flechas no pueden ser generadores y no queremos continuas 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 # no permite esto también por reasons algo similares.


Además de la discusión en esdiscuss.org y las notas de la reunión de ES6 del comité Ecma TC39 de noviembre de 2013 mencionadas anteriormente, las flechas generadoras fueron revisadas en dos reuniones de ES7 de septiembre de 2016 [1] [2] . Después de una discusión sobre los pros y los contras de varias sintaxis (principalmente =*> y =>* ) y la falta de justificaciones y casos de uso para esta característica, llegaron a la conclusión de que:

  • Existe cierto interés por parte del comité, pero la preocupación de que la característica no ejerza su peso para agregar una nueva sintaxis
  • Planee volver a visitar el Día 3 para ver si podemos llegar =>* a la etapa 0 al menos, como parte de la propuesta de iteración asíncrona de [Domenic Denicola]

La propuesta de flechas generadoras se trasladó a la Etapa 1 con Brendan Eich y Domenic Denicola como campeones, pero todavía no existe un repositorio tc39/proposals relevante. Supongo que para más noticias uno tiene que esperar hasta que se finalice la propuesta de iteración asíncrona de la Etapa 3.


Hay una buena solución con redux-saga

import { call, all } from ''redux-saga/effects''; function* gen() { yield all([].map(() => { return call(....); })); }


Sé que esto es muy tarde, pero otra posible razón podría ser la sintaxis. tal vez (*() => {}) funciona, pero ¿qué pasa con (9 ** () => {}) ? ¿Es 9 el poder de una función de flecha, que devuelve NaN , o es 9 veces una función de flecha del generador, que también devuelve NaN ? Podría hacerse con alguna sintaxis alternativa, como =>* como se menciona en otra respuesta aquí, pero tal vez hubo un deseo de preservar la consistencia de la sintaxis de la función del generador (por ejemplo, function* () {} y { *genMethod() {} } ) cuando se estaba implementando. No es una gran excusa, sino una razón para ello.


También tenía la misma pregunta y vine aquí. Después de leer las publicaciones y los comentarios, sentí que usar el generador en una función de flecha parece ser vago:

const generator = () => 2*3; // * implies multiplication // so, this would be a confusing const generator = () =>* something; // err, multiplying? const generator = () =*> ... // err, ^^ const generator = ()*=> ... // err, *=3, still multiplying? const generator=*()=> ... // err, ^^ const generator = *param => ... //err, "param" is not fixed word

Esta es la razón por la que no implementaron el generador en relación con la función de flecha.

Pero, si fuera uno de ellos, podría haber pensado así:

const generator = gen param => ... // hmm, gen indicates a generator const generator = gen () => ... // ^^

Esto se siente como si tuviéramos una función asincrónica:

const asyncFunction = async () => ... // pretty cool

Porque, con la función normal, la palabra clave asincrónica existe, por lo que la función de flecha la está utilizando async () => es probable que async () => parezca una async function() .

Pero, no hay palabras clave como gen o generator y, por desgracia, la función de flecha no lo está utilizando.

Para concluir:

Incluso si desean implementar el generador en la función de flecha, creo que necesitan repensar la sintaxis del generador en el núcleo js:

generator function myfunc() {} // rather than function* myfunc() {} // or, function *myfunc() {}

Y esto será un gran error. Por lo tanto, mantener la función de flecha fuera del generador es bastante bueno.

Siguiendo el comentario de @Bergi :

No. Se supone que las funciones de flecha son livianas (y no tienen un prototipo. Por ejemplo) y, a menudo, de una sola línea, mientras que los generadores son más o menos lo contrario.

Diré que el propósito del generador para usar es run-stop-run y, por lo tanto, no creo que debamos preocuparnos por el prototipo, esto léxico, etc.