with - O que é “função*” em JavaScript?




function with arrow javascript (2)

this 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 do que a function* deve ser. O que é isso?

PS não se incomode tentando Google, é impossible procurar por expressões com asteriscos ( eles são usados ​​como espaços reservados ).


É uma função geradora - e foi dito na página que você cita, no comentário que você substituiu por "essa é a linha interessante" ...

Basicamente, é uma forma de especificar seqüências programaticamente para que elas possam ser passadas e elementos acessados ​​por índice sem ter que calcular a seqüência inteira (possivelmente infinita em tamanho) antecipadamente.


É uma função de Generator .

Geradores são funções que podem ser encerradas e, posteriormente, reintroduzidas. Seu contexto (ligações variáveis) será salvo entre as reentrâncias.

Chamar uma função de gerador não executa seu corpo imediatamente; um objeto iterador para a função é retornado em vez disso. Quando o método next() do iterador é chamado, o corpo da função geradora é executado até a primeira expressão yield , que especifica o valor a ser retornado do iterador ou, com yield* , delega a outra função geradora.

Nota Histórica:

É uma sintaxe proposta para o EcmaScript.next .

Dave Herman, da Mozilla, fez uma palestra sobre EcmaScript.next . Às 30:15 ele fala sobre geradores.

Anteriormente, ele explica como a Mozilla está implementando experimentalmente mudanças de linguagem propostas para ajudar a orientar o comitê. Dave trabalha de perto com Brendan Eich, CTO da Mozilla (eu acho), e o designer original do JavaScript.

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) tem um consenso geral de que o EcmaScript.next deve ter algum tipo de proposta de iterador de gerador, mas isso não é definitivo.

Você não deve confiar em que isso apareça sem alterações na próxima versão do idioma e, mesmo que isso não mude, provavelmente ele não será exibido amplamente em outros navegadores por um tempo.

visão global

Coroutines de primeira classe, representadas como objetos que encapsulam contextos de execução suspensos (por exemplo, ativações de função). Arte prévia: Python, Icon, Lua, Scheme, Smalltalk.

Exemplos

A sequência “infinita” dos números de Fibonacci (não obstante o comportamento em torno de 2 53 ):

function* fibonacci() {
    let [prev, curr] = [0, 1];
    for (;;) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

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




ecmascript-6