2014-03-24 47 views
7

我知道「新」和直接調用一個正常功能之間的區別。「new」和直接調用generator函數有什麼區別?

但是發電機功能的情況如何?

e.g:

function *counter(){ 
    let n = 0; 
    while (n < 2) { 
     yield n++; 
    } 
    return 10; 
} 

var countIter1 = new counter(); 
var countIter2 = counter(); 

看來他們是一樣的嗎?

+0

當你再次調用counter()時會發生什麼? –

+0

@JacobKrall將生成另一個生成器 – kelviN

+2

我只查看了當前的規範,但在描述['GeneratorFunction'構造函數]的部分下面(http://people.mozilla.org/~jorendorff/es6-draft .html#sec-generatorfunction-objects),它說明了關於結果函數的以下內容...... *「爲使用GeneratorFunction構造函數創建的每個函數自動創建一個prototype屬性,以提供該函數將用作一個構造函數。「*所以這不是一個完整的答案,但它確實表明它們可以正確地用作構造函數。 –

回答

1

生成器允許您通過編寫一個可以維護其自身狀態的函數來定義迭代算法。生成器是一種特殊類型的函數,可用作迭代器的工廠。如果一個函數包含一個或多個yield表達式,該函數就變成了一個生成器。當調用生成器函數時,該函數的主體不會立即執行;相反,它返回一個生成器 - 迭代器對象。每次調用generator-iterator的next()方法都會執行函數的主體直到下一個yield表達式並返回結果。當到達函數結尾或返回語句時,會引發StopIteration異常。 生成器函數可以直接用作類的方法迭代器,大大減少了創建自定義迭代器所需的代碼量。

function Range(low, high){ 
     this.low = low; 
     this.high = high; 
    } 
    Range.prototype.__iterator__ = function(){ 
     for (var i = this.low; i <= this.high; i++) 
     yield i; 
    }; 
    var range = new Range(3, 5); 
    for (var i in range) 
     print(i); // prints 3, then 4, then 5 in sequence 

並非所有的發電機終止;可以創建一個代表無限序列的發生器。

相關問題