La declaraci贸n function*
(la palabra clave function
seguida de un asterisco) define una funci贸n generadora, que devuelve un objeto Generator
.
Tambi茅n puedes definir funciones generadoras usando el constructor GeneratorFunction
y una function* expression
.
Sintaxis
function* nombre([param[, param[, ... param]]]) { instrucciones }
nombre
- El nombre de la funci贸n.
param
- El nombre de los argumentos que se le van a pasar a la funci贸n. Una funci贸n puede tener hasta 255 argumentos.
instrucciones
- Las instrucciones que componen el cuerpo de la funci贸n.
Descripci贸n
Los generadores son funciones de las que se puede salir y volver a entrar. Su contexto (asociaci贸n de variables) ser谩 conservado entre las reentradas.
La llamada a una funci贸n generadora no ejecuta su cuerpo inmediatamente; se devuelve un objeto iterador para la funci贸n en su lugar. Cuando el metodo next()
del iterador es llamado , el cuerpo de la funci贸n generadora es ejecutado hasta la primera expresi贸n yield
, la cual especifica el valor que ser谩 retornado por el iterador o con, yield*
, delega a otra funci贸n generadora. El m茅todo next()
retorna un objeto con una propiedad value que contiene el valor bajo el operador yield y una propiedad done que indica, con un booleano, si la funci贸n generadora ha hecho yield al 煤ltimo valor.
Ejemplos
Ejemplo simple
function* idMaker(){
var index = 0;
while(index < 3)
yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined
// ...
Ejemplo con yield*
function* anotherGenerator(i) {
yield i + 1;
yield i + 2;
yield i + 3;
}
function* generator(i){
yield i;
yield* anotherGenerator(i);
yield i + 10;
}
var gen = generator(10);
console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20
Especificaciones
Especificaciones | Status | Comentarios |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) La definici贸n de 'function*' en esta especificaci贸n. |
Standard | Initial definition. |
Compatibilidad con navegadores
Caracter铆stica | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Soporte b谩sico | 39.0 | 26.0 (26.0) | Sin soporte | 26 | Sin soporte |
yield* |
(Yes) | 27.0 (27.0) | Sin soporte | 26 | Sin soporte |
IteratorResult object instead of throwing |
(Yes) | 29.0 (29.0) | Sin soporte | (Yes) | Sin soporte |
Caracter铆stica | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Soporte b谩sico | (Yes) | 39.0 | 26.0 (26.0) | Sin soporte | Sin soporte | Sin soporte |
yield* |
(Yes) | (Yes) | 27.0 (27.0) | Sin soporte | Sin soporte | Sin soporte |
IteratorResult object instead of throwing |
? | (Yes) | 29.0 (29.0) | Sin soporte | Sin soporte | Sin soporte |
Notas espec铆ficas de Firefox
Generadores e iteradores en versiones de Firefox anteriores a 26
Las versiones anteriores de FireFox implementan as铆 mismo una versi贸n anterior de la propuesta de generadores. En la versi贸n anterior, los generadores eran definidos utilizando la declaraci贸n function
de una manera regular (Sin asterisco). V茅ase Legacy generator function para mayor informaci贸n.
IteratorResult
object returned instead of throwing
Starting with Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), the completed generator function no longer throws a TypeError
"generator has already finished". Instead, it returns an IteratorResult
object like { value: undefined, done: true }
(error 958951).
Ver tambi茅n
function* expression
GeneratorFunction
object- The Iterator protocol
yield
yield*
Function
objectfunction declaration
function expression
Functions and function scope
- Other web resources:
- Regenerator an ES2015 generator compiler to ES5
- Forbes Lindesay: Promises and Generators: control flow utopia -- JSConf EU 2013
- Hemanth.HM: The New gen of *gen(){}
- Task.js