2014-02-25 9 views
7

Ich stieß auf dieses Idom: von dieser Seite https://github.com/jmar777/suspend und nicht sicher, was es tut.Was bedeutet "function *()" in nodejs?

Könnte jemand erklären? Danke!

+1

http://wiki.ecmascript.org/doku.php?id=harmony:generators –

+0

Es ist Generator-Funktion (EcmaScript) und die Frage wurde bereits [hier] beantwortet (http://stackoverflow.com/questions/9620586/function-in-javascript). –

Antwort

4

Dies bedeutet, dass die Funktion eine Generatorfunktion ist. Zitieren von http://wiki.ecmascript.org/doku.php?id=harmony:generators#syntax

Eine Funktion mit einem * Token ist bekannt als eine Generatorfunktion.

Normale Funktionen ausführen und das Ergebnis zurückgeben. Aber Generatoren liefern Werte und warten darauf, dass sie wieder aufgerufen werden. Dann wird die Funktion seine Ausführung fortsetzen.

Generatorfunktionen werden normalerweise iteriert. Da sie die Werte ergeben und vom nächsten Funktionsaufruf warten, um die Ausführung fortzusetzen, sind sie nützlich für Generatoren mit unendlichen Werten.

Sie sind auch speichereffizient. Nehmen wir beispielsweise an, Sie möchten 10000000 Zahlen erzeugen, wenn wir sie in einem Array speichern, könnten wir den Speicher der Maschine erschöpfen. Aber wenn wir einen Generator verwenden, können wir eine Zahl, den Fließwert, erzeugen, und wenn er erneut aufgerufen wird, wird die Ausführung wieder aufgenommen und die nächste Zahl kann erzeugt werden.

Wir bei den Beispielen sehen kann, here,

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

Und wie gesagt, Generatoren sind wie diese

iteriert
for (n of fibonacci()) { 
    // truncate the sequence at 1000 
    if (n > 1000) 
     break; 
    print(n); 
} 

der Generator Siehe Funktion tatsächlich eine unendliche Schleife hat. Wenn yield curr ausgeführt wird, wird der Wert an n in n of fibonacci() zurückgegeben. Dies wird in der Iteration verwendet und wenn der Generator erneut aufgerufen wird, nimmt er die Ausführung wieder auf (er behält die Daten auch in Variablen bei) und erzeugt das nächste Element.