我知道" new"并直接调用正常函数。
但是生成器功能的情况怎么样?
e.g:
function *counter(){
let n = 0;
while (n < 2) {
yield n++;
}
return 10;
}
var countIter1 = new counter();
var countIter2 = counter();
他们似乎一样吗?
答案 0 :(得分:1)
生成器允许您通过编写可以维护其自身状态的单个函数来定义迭代算法。生成器是一种特殊类型的函数,可用作迭代器的工厂。如果函数包含一个或多个yield表达式,则它将成为生成器。当调用生成器函数时,函数体不会立即执行;相反,它返回一个generator-iterator对象。每次调用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
并非所有发电机都终止;可以创建一个代表无限序列的生成器。