2016-04-27 16 views
1

diesem CodeIterieren

let func = function *(){ 
    for (let i = 1; i < 5; i++) { 
     yield i; 
    } 
} 
let s = func().next(); 
console.log(s); 
let s2 = func().next(); 
console.log(s2); 

kehrt

Object {value: 1, done: false} 
Object {value: 1, done: false} 

so dass im Grunde func Ausbeuten erste Wert die ganze Zeit.

Aber wenn ich zu

ändern
let f = func(); 
let s = f.next(); 
console.log(s); 
let s2 = f.next(); 
console.log(s2); 

es wie erwartet funktioniert. Warum die Zuweisung von Funktionen an Variablen macht einen solchen Unterschied?

+0

Weil ' func()! == func() '? – Bergi

+0

Wenn es sich anders verhalten würde, dann könnte jede Generatorfunktion nur * einmal * verwendet werden ... –

Antwort

3

In Ihrem ersten Codebeispiel erstellen Sie immer eine neue Generatorinstanz. Ich habe die entsprechenden Instanzen zu einzelnen Variablen zugewiesen dies deutlicher zu veranschaulichen:

// first generator instance 
let g = func(); 
// first call to next on the first instance 
let s = g.next(); 
console.log(s); 
// second generator instance 
let g2 = func(); 
// first call to next on the second instance 
let s2 = g2.next(); 
console.log(s2); 

Während in Ihrem zweiten Schnipsel, können Sie den gleichen Generator halten Iterieren (übertragen auf die Variable f):

let f = func(); 
// first call to next 
let s = f.next(); 
console.log(s); 
// second call to next 
let s2 = f.next(); 
console.log(s2);