“new”和直接调用生成器函数有什么区别?

7

我知道用"new"实例化以及直接调用普通函数的区别。

但是对于生成器函数呢?

比如:

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

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

看起来它们是相同的吗?


当您再次调用 counter() 时会发生什么? - Jacob Krall
@JacobKrall 那会产生另一个生成器。 - kelviN
2
我只是粗略地浏览了当前的规范,但在描述GeneratorFunction构造函数的部分中,它对于生成的函数有以下说明... "使用GeneratorFunction构造函数创建的每个函数都会自动创建一个原型属性,以提供该函数可能被用作构造函数的可能性。" 因此这不是一个完整的答案,但它确实表明它们可以正确地用作构造函数。 - cookie monster
1个回答

1
生成器允许您通过编写一个函数来定义迭代算法,该函数可以维护自己的状态。生成器是一种特殊类型的函数,可作为迭代器的工厂。如果一个函数包含一个或多个 yield 表达式,则它就成为了一个生成器。当调用生成器函数时,函数体不会立即执行;相反,它返回一个生成器迭代器对象。每次调用生成器迭代器的 next() 方法都会执行函数体,直到下一个 yield 表达式并返回其结果。当到达函数结尾或 return 语句时,将抛出 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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接