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 defunction
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
onew.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 elreturn
en el caso del cuerpo del Bloque para que regrese de la función de flecha que encierra inmediatamente, e impiden labreak
ycontinue
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.