2015-10-14 61 views
2

我創造了一個函數foo的變量如下爲什麼發電機給出相同的輸出,如果沒有分配給

function* foo(){ 
    var index = 0; 
    while (index <= 2) 
    yield index++; 
} 

當我打電話下面的函數給出了相同的輸出

console.log(foo().next()); //Object {value: 0, done: false} 
console.log(foo().next()); //Object {value: 0, done: false} 
console.log(foo().next()); //Object {value: 0, done: false} 

但是當我試圖下面給作爲例外輸出

var xx=foo(); 
console.log(xx.next()); //Object {value: 0, done: false} 
console.log(xx.next()); //Object {value: 1, done: false} 
console.log(xx.next()); //Object {value: 2, done: false} 
console.log(xx.next()); //Object {value: undefined, done: true} 

我只是想明白它背後的原因,爲什麼發生這種情況

回答

4

生成器函數調用時會返回一個Iterator。再次調用生成器會返回一個新的迭代器。

這裏是如何工作的一個例子:

function* countdown(start){ 
    while (start > 0) 
    yield start--; 
} 

var countdown1 = countdown(10); 
var countdown2 = countdown(20); 

現在我們有2個「活」倒計時迭代器,第一個將產生10..1,第二個將產生20..1。我們可以調用每個獨立於其他的.next()和國家的正確維護:

console.log(countdown1.next().value) // 10 
console.log(countdown1.next().value) // 9 
console.log(countdown1.next().value) // 8 

console.log(countdown2.next().value) // 20 
console.log(countdown2.next().value) // 19 
console.log(countdown2.next().value) // 18 

console.log(countdown1.next().value) // 7 
console.log(countdown1.next().value) // 6 
console.log(countdown1.next().value) // 5 

的迭代器不必須由發電機產生的,雖然...所有需要的對象是一個迭代器它有一個next()成員函數,該函數返回簽名爲{value: x, done: trueOrFalse}的對象。爲了充分利用這個模式,你需要將它附加到一個迭代器。 Iterable是具有返回迭代器的[Symbol.iterator]屬性的對象。例如:

function nonGeneratorCountdown() { 
    return { 
    next: arg => { 
     if (this.count > 0) { 
     return {value: this.count--, done: false}; 
     } 
     return {done: true}; 
    } 
    }; 
} 
var iterable = { 
    count: 3, 
    [Symbol.iterator]: nonGeneratorCountdown 
}; 

for(let i of iterable) { 
    console.log(i); // 3, 2, 1 
} 

所以......在你的代碼:

console.log(foo().next()); 

總是返回一個新的迭代器,調用它.next()並記錄返回值。

var xx=foo(); 
console.log(xx.next()); 
console.log(xx.next()); 

另一方面,多次只使用一個迭代器,並記錄它的迭代(和更改)結果。

+1

這是既正確又正確的答案 - 但它很少說明和解釋OP的行爲。請考慮添加一個例子,解釋爲什麼它有用或做類似的事情。 –

+0

@BenjaminGruenbaum - 更好? :-) – Amit

+0

非常感謝。一個不是生成器的迭代器的例子也很好:) –

相關問題