Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这两者之间的区别是什么;新";直接调用生成器函数?_Javascript_Generator_Ecmascript Harmony - Fatal编程技术网

Javascript 什么';这两者之间的区别是什么;新";直接调用生成器函数?

Javascript 什么';这两者之间的区别是什么;新";直接调用生成器函数?,javascript,generator,ecmascript-harmony,Javascript,Generator,Ecmascript Harmony,我知道“新建”和直接调用普通函数之间的区别 但是发电机功能的情况如何 e、 g: 函数*计数器(){ 设n=0; 而(n

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

但是发电机功能的情况如何

e、 g:

函数*计数器(){
设n=0;
而(n<2){
产量n++;
}
返回10;
}
var countIter1=新计数器();
var countIter2=计数器();

似乎它们是一样的?

生成器允许您通过编写一个可以保持其自身状态的函数来定义迭代算法。生成器是一种特殊类型的函数,用作迭代器的工厂。如果一个函数包含一个或多个屈服表达式,则该函数成为生成器。调用生成器函数时,函数体不会立即执行;相反,它返回一个生成器迭代器对象。对生成器迭代器的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
功能范围(低、高){
这个.低=低;
这个高=高;
}
Range.prototype.\uuuu迭代器\uuuu=function(){

对于(var i=this.low;i)再次调用
counter()
时会发生什么?@JacobKrall这将生成另一个生成器我只浏览了当前规范,但在描述的部分下,它说明了以下关于生成函数的内容。。。“使用GeneratorFunction构造函数创建的每个函数都会自动创建一个prototype属性,以提供函数用作构造函数的可能性。”因此,这不是一个完整的答案,但确实表明它们可以正确用作构造函数。
 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