Es una función de generador .
Los generadores son funciones que se pueden salir y luego volver a ingresar. Su contexto (enlaces variables) se guardará en las reentradas.
Llamar a una función generadora no ejecuta su cuerpo inmediatamente; en su lugar se devuelve un objeto iterador para la función. Cuando next()
se llama al método del iterador , el cuerpo de la función del generador se ejecuta hasta la primera yield
expresión, que especifica el valor que se devolverá del iterador o, con yield*
, delega a otra función del generador.
Nota histórica:
Es una sintaxis propuesta para EcmaScript.next
.
Dave Herman de Mozilla dio una charla sobre EcmaScript.next . A las 30:15 habla de generadores.
Anteriormente, explica cómo Mozilla está implementando experimentalmente los cambios de idioma propuestos para ayudar a dirigir el comité. Dave trabaja en estrecha colaboración con Brendan Eich, el CTO de Mozilla (creo), y el diseñador original de JavaScript.
Puede encontrar más detalles en el wiki del grupo de trabajo EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators
El grupo de trabajo (TC-39) tiene un acuerdo general de que EcmaScript.next debería tener algún tipo de propuesta de iterador generador, pero esto no es definitivo.
No debe confiar en que aparezca sin cambios en la próxima versión del idioma, e incluso si no cambia, probablemente no se mostrará ampliamente en otros navegadores por un tiempo.
Visión general
Corutinas de primera clase, representadas como objetos que encapsulan contextos de ejecución suspendidos (es decir, activaciones de funciones). Técnica anterior: Python, Icon, Lua, Scheme, Smalltalk.
Ejemplos
La secuencia "infinita" de números de Fibonacci (a pesar del comportamiento alrededor de 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Los generadores se pueden iterar en bucles:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
Los generadores son iteradores:
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
function*
sintaxis es compatible con Firefox desde v26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. Las versiones anteriores usaban una sintaxis diferente.