function*
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* expressionGeneratorFunctionobject- The Iterator protocol
yieldyield*Functionobjectfunction declarationfunction expressionFunctions 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

