Javascript 为什么生成器在未分配给变量时提供相同的输出
我创建了一个函数foo,如下所示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
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());