7

我知道“新”和直接调用普通函数之间的区别。

但是生成器函数的情况如何?

例如:

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

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

好像他们是一样的?

4

1 回答 1

1

生成器允许您通过编写可以维护自己的状态的单个函数来定义迭代算法。生成器是一种特殊类型的函数,可用作迭代器的工厂。如果一个函数包含一个或多个 yield 表达式,它就会成为一个生成器。当一个生成器函数被调用时,函数的主体不会立即执行;相反,它返回一个生成器迭代器对象。每次调用生成器迭代器的 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

并非所有生成器都终止;可以创建一个表示无限序列的生成器。

于 2014-03-27T06:23:28.680 回答