Em esta página eu encontrei um novo tipo de função JavaScript:
// NOTE: "function*" is not supported yet in Firefox.
// Remove the asterisk in order for this code to work in Firefox 13
function* fibonacci() { // !!! this is the interesting line !!!
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Eu já sei o que yield
, let
e [?,?]=[?,?]
fazer , mas não tenho idéia o que o function*
pretende ser. O que é isso?
O PS não se incomoda em tentar o Google, é impossível procurar expressões com asteriscos ( eles são usados como espaços reservados ).
javascript
function
ecmascript-6
QNA da cadeia
fonte
fonte
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.*
foi retirado do link de @Nickolay. Aqui está um link diretamentefunction*
no MDN . Com certeza, suporte "básico" desde a v26 .Respostas:
É uma função de 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.
fonte
for(;;)
)? Por que usá-lo neste contexto?for(;;)
é o mesmo quewhile (true)
. É usada neste contexto, pois a sequência de Fibonacci é uma sequência ilimitada.É uma função geradora - e foi o que você disse na página que você mencionou, no comentário que você substituiu por "esta é a linha interessante" ...
Basicamente, é uma maneira de especificar seqüências programaticamente para que elas possam ser passadas e elementos acessados pelo índice sem precisar calcular a sequência inteira (possivelmente com tamanho infinito) antecipadamente.
fonte
O
function*
tipo parece atuar como uma função geradora de processos que podem ser iterados. C # tem um recurso como este usando "yield return", veja 1 e veja 2Essencialmente, isso retorna cada valor um por um para o que estiver iterando essa função, razão pela qual o caso de uso o mostra em um loop de estilo foreach.
fonte