function*

This is a new technology, part of the ECMAScript 2015 (ES6) standard.
This technology's specification has been finalized, but check the compatibility table for usage and implementation status in various browsers.

Resumo

A declaração function* (palavra chave function seguida de um asterisco) define um gerador de funçāo (generator function).

Você também pode definir geradores de funçāo usando o construtor GeneratorFunction e uma expressão function*.

Sintaxe

function* name([param[, param[, ... param]]]) {
   statements
}
name
O nome da função.
param
O nome do argumento que será passado á função. Uma função pode ter até 255 argumentos.
statements
As instruções que formam o corpo da função.

Descrição

Geradores são funções das quais podemos interromper e retornar sua execução depois. Seus contextos (de associações de variáveis) ficarão salvas entre as re-entradas.

Chamar uma função geradora não executa seu corpo imediatamente; ao invés disso um objeto iterator é retornado. Quando o método next() do objeto iterator é chamado, o corpo da função do gerador é executado até a primeira expressão yield, que especifica o valor a ser devolvido do iterator ou, com yield*, delega para outra função geradora. O método next() retorna um objeto com propriedade value contendo o valor rendido e uma propriedade done indicando se o gerador rendeu seu último valor.

Exemplos

Exemplo simples

function* idMaker(){
    var index = 0;
    while(true)
        yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...

Exemplo com yield*

function* outroGerador(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}
function* gerador(i){
  yield i;
  yield* outroGerador(i);
  yield i + 10;
}

var gen = gerador(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

Especificações

Especificação Status Comentário
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'function*' in that specification.
Standard Definição inicial.

Compatibilidade nos browsers

Funcionalidade Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Suporte básico 39 26.0 (26.0) Não suportado 26 Não suportado
yield* (Yes) 27.0 (27.0) Não suportado 26 Não suportado
Objeto IteratorResult ao invés de throw (Yes) 29.0 (29.0) Não suportado (Yes) Não suportado
Funcionalidade Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suporte básico (Yes) 26.0 (26.0) Não suportado Não suportado Não suportado
yield* (Yes) 27.0 (27.0) Não suportado Não suportado Não suportado
Objeto IteratorResult ao invés de throw ? 29.0 (29.0) Não suportado Não suportado Não suportado

Observações específicas para Firefox

Generators e iterators no Firefox versões anteriores a 26

Versões mais antigas do Firefox implementam uma versão antiga da proposta de generators. Na versão mais antiga, generators foram definidos a usarem uma palavra chave function (sem um asterísco) dentre outras diferenças.

O retorno do objeto IteratorResult ao invés de um throw

Iniciando com Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), o generator finalizado não lança mais uma exceção TypeError "generator has already finished". Ao invés disso, ele retorna um objeto IteratorResult como por exemplo { value: undefined, done: true } (bug 958951).

Veja também

Etiquetas do documento e colaboradores

 Colaboradores desta página: cezaraugusto, AlanCezarAraujo
 Última atualização por: cezaraugusto,