È una funzione del generatore .
I generatori sono funzioni che possono essere abbandonate e successivamente reinserite. Il loro contesto (collegamenti variabili) verrà salvato tra i rientri.
La chiamata di una funzione generatore non esegue immediatamente il suo corpo; viene invece restituito un oggetto iteratore per la funzione. Quando next()
viene chiamato il metodo dell'iteratore , il corpo della funzione generatore viene eseguito fino alla prima yield
espressione, che specifica il valore da restituire dall'iteratore o, con yield*
, delega a un'altra funzione generatore.
Nota storica:
È una sintassi proposta per EcmaScript.next
.
Dave Herman di Mozilla ha tenuto un discorso su EcmaScript.next . Alle 30:15 parla di generatori.
In precedenza, spiega come Mozilla sta implementando sperimentalmente le modifiche linguistiche proposte per aiutare a guidare il comitato. Dave lavora a stretto contatto con Brendan Eich, CTO di Mozilla (credo) e il designer JavaScript originale.
Puoi trovare maggiori dettagli sul wiki del gruppo di lavoro EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators
Il gruppo di lavoro (TC-39) ha un accordo generale sul fatto che EcmaScript.next dovrebbe avere una sorta di proposta di iteratore del generatore, ma questo non è definitivo.
Non dovresti fare affidamento sul fatto che questo venga mostrato senza modifiche nella prossima versione della lingua e anche se non cambia, probabilmente non verrà visualizzato ampiamente in altri browser per un po '.
Panoramica
Coroutine di prima classe, rappresentati come oggetti che incapsulano contesti di esecuzione sospesi (ovvero attivazioni di funzioni). Arte nota: Python, Icon, Lua, Scheme, Smalltalk.
Esempi
La sequenza "infinita" di numeri di Fibonacci (nonostante il comportamento attorno a 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
I generatori possono essere ripetuti in loop:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
I generatori sono iteratori:
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
function*
sintassi è supportata in Firefox dal v26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. Le versioni precedenti utilizzavano una sintassi diversa.