É uma função de gerador .
Geradores são funções que podem ser encerradas e posteriormente reinseridas. Seu contexto (ligações variáveis) será salvo nas reentrâncias.
Chamar uma função de gerador não executa seu corpo imediatamente; um objeto iterador para a função é retornado. Quando o next()
método do iterador é chamado, o corpo da função do gerador é executado até a primeira yield
expressão, que especifica o valor a ser retornado do iterador ou, com yield*
, delega para outra função do gerador.
Nota histórica:
É uma sintaxe proposta para EcmaScript.next
.
Dave Herman, da Mozilla, falou sobre o EcmaScript.next . Às 30:15, ele fala sobre geradores.
Antes, ele explica como a Mozilla está implementando experimentalmente as alterações de idioma propostas para ajudar a dirigir o comitê. Dave trabalha em estreita colaboração com Brendan Eich, CTO da Mozilla (eu acho) e o designer JavaScript original.
Você pode encontrar mais detalhes no wiki do grupo de trabalho EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators
O grupo de trabalho (TC-39) concorda que o EcmaScript.next deve ter algum tipo de proposta de gerador de iterador, mas isso não é final.
Você não deve confiar nisso aparecendo sem alterações na próxima versão do idioma e, mesmo que não mude, provavelmente não aparecerá amplamente em outros navegadores por um tempo.
Visão geral
Corotinas de primeira classe, representadas como objetos que encapsulam contextos de execução suspensos (ou seja, ativações de funções). Técnica anterior: Python, Ícone, Lua, Esquema, Smalltalk.
Exemplos
A sequência "infinita" de números de Fibonacci (apesar do comportamento em torno de 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Os geradores podem ser iterados em loops:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
Geradores são 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*
sintaxe é suportada no Firefox desde a v26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. As versões anteriores usavam uma sintaxe diferente.