"new"和直接调用生成器函数之间有什么区别?

kel*_*viN 7 javascript generator ecmascript-harmony

我知道"新"和直接调用普通函数之间的区别.

但是发电机功能如何呢?

例如:

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

var countIter1 = new counter();
var countIter2 = counter();
Run Code Online (Sandbox Code Playgroud)

看来他们是一样的?

use*_*r-S 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
Run Code Online (Sandbox Code Playgroud)

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