Che cos’è la “funzione *” in JavaScript?

In questa pagina ho trovato un nuovo tipo di funzione 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; } } 

So già cosa yield , let e [?,?]=[?,?] Do , ma non ho idea di cosa significhi la function* . Che cos’è?

PS non si preoccupa di provare Google, è imansible cercare espressioni con asterischi ( sono usati come segnaposto ).

È una funzione del generatore .

I generatori sono funzioni che possono essere abbandonate e successivamente reinserite. Il loro contesto (legami variabili) sarà salvato attraverso i re-ingressi.

Chiamare una funzione generatore non esegue immediatamente il suo corpo; un object iteratore per la funzione viene invece restituito. Quando viene chiamato il metodo next() dell’iteratore, il corpo della funzione del generatore viene eseguito fino alla prima espressione yield , che specifica il valore da restituire dall’iteratore o, con yield* , delegato a un’altra funzione del generatore.


Nota storica:

È una syntax proposta per EcmaScript.next .

Dave Herman di Mozilla ha tenuto un discorso su EcmaScript.next . Alle 30:15 parla dei generatori.

In precedenza, spiega come Mozilla sta implementando sperimentalmente le modifiche del linguaggio 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 ulteriori dettagli sul wiki del gruppo di lavoro di EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators

Il gruppo di lavoro (TC-39) concorda sul fatto che EcmaScript.next dovrebbe avere una sorta di proposta di iteratore del generatore, ma questo non è definitivo.

Non dovresti fare affidamento su questa presentazione senza modifiche nella prossima versione della lingua, e anche se non cambia, probabilmente non comparirà molto in altri browser per un po ‘.

Panoramica

Coroutine di prima class, rappresentate come oggetti che incapsulano contesti di esecuzione sospesi (cioè triggerszioni 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 su 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 

È una funzione di generatore – e lo ha detto nella pagina che citi, nel commento che hai sostituito con “questa è la linea interessante” …

Fondamentalmente è un modo per specificare le sequenze a livello di codice in modo che possano essere passati in giro e gli elementi a cui accede l’indice senza dover calcolare in anticipo l’intera sequenza (possibilmente di dimensioni infinite).

Il tipo di function* sembra che funzioni come una funzione generatore per processi che possono essere ripetuti. C # ha una funzione come questa che usa “yield return” vedere 1 e vedere 2

In sostanza, ciò restituisce ciascun valore uno alla volta a qualsiasi cosa stia iterando questa funzione, motivo per cui il loro caso d’uso lo mostra in un ciclo di stile foreach.