Javascript 为什么生成器在未分配给变量时提供相同的输出

Javascript 为什么生成器在未分配给变量时提供相同的输出,javascript,ecmascript-6,Javascript,Ecmascript 6,我创建了一个函数foo,如下所示 function* foo(){ var index = 0; while (index <= 2) yield index++; } 但当我尝试跟随时,我给出了例外的输出 var xx=foo(); console.log(xx.next()); //Object {value: 0, done: false} console.log(xx.next()); //Object {value: 1, done: false} consol

我创建了一个函数foo,如下所示

function* foo(){
  var index = 0;
  while (index <= 2)
    yield index++;
}
但当我尝试跟随时,我给出了例外的输出

var xx=foo();
console.log(xx.next()); //Object {value: 0, done: false}
console.log(xx.next()); //Object {value: 1, done: false}
console.log(xx.next()); //Object {value: 2, done: false}
console.log(xx.next()); //Object {value: undefined, done: true}
我只是想了解背后的原因,为什么会发生这种事


生成器函数在调用时返回迭代器。再次调用生成器将返回一个新的迭代器

下面是一个如何工作的示例:

function* countdown(start){
  while (start > 0)
    yield start--;
}

var countdown1 = countdown(10);
var countdown2 = countdown(20);
现在我们有两个“实时”倒计时迭代器,第一个将产生10..1,第二个将产生20..1。我们可以独立于另一个调用
.next()
,并正确维护状态:

console.log(countdown1.next().value) // 10
console.log(countdown1.next().value) // 9
console.log(countdown1.next().value) // 8

console.log(countdown2.next().value) // 20
console.log(countdown2.next().value) // 19
console.log(countdown2.next().value) // 18

console.log(countdown1.next().value) // 7
console.log(countdown1.next().value) // 6
console.log(countdown1.next().value) // 5
但迭代器不必由生成器生成。。。一个对象成为迭代器所需要的只是它有一个
next()
成员函数,该函数返回一个签名为
{value:x,done:trueOrFalse}
的对象。不过,要充分利用此模式,需要将其附加到iterable。Iterable是具有返回迭代器的
[Symbol.iterator]
属性的对象。例如:

function nonGeneratorCountdown() {
  return {
    next: arg => {
      if (this.count > 0) {
        return {value: this.count--, done: false};
      }
      return {done: true};
    }
  };
}
var iterable = {
  count: 3,
  [Symbol.iterator]: nonGeneratorCountdown
};

for(let i of iterable) {
  console.log(i); // 3, 2, 1
}

所以。。。在代码中:

console.log(foo().next());
始终返回新的迭代器,对其调用
.next()
,并记录返回的值

var xx=foo();
console.log(xx.next());
console.log(xx.next());

另一方面,仅使用一个迭代器几次,并记录迭代结果(和变化的结果)。

这是正确的和正确的答案-但是它很少说明和解释OP的行为。请考虑添加一个例子,解释它为什么有用或者做类似的事情。@BenjaminGruenbaum-更好?:-)非常感谢。使用迭代器而不是生成器的示例也很好:)
var xx=foo();
console.log(xx.next());
console.log(xx.next());