在ES6中迭代生成器

时间:2016-04-27 16:02:26

标签: javascript ecmascript-6 generator yield

此代码

let func = function *(){
    for (let i = 1; i < 5; i++) {
        yield i;
    }
}
let s = func().next();
console.log(s);
let s2 = func().next();
console.log(s2);

返回

Object {value: 1, done: false}
Object {value: 1, done: false}

所以基本上func一直产生第一个值。

但是当我改为

let f = func();
let s = f.next();
console.log(s);
let s2 = f.next();
console.log(s2);

它按预期工作。 为什么将func赋值给变量会产生这样的差异?

1 个答案:

答案 0 :(得分:3)

在第一段代码中,您始终在创建新的生成器实例。我已将这些实例分配给单独的变量,以便更清楚地说明这一点:

// first generator instance
let g = func();
// first call to next on the first instance
let s = g.next();
console.log(s);
// second generator instance
let g2 = func();
// first call to next on the second instance
let s2 = g2.next();
console.log(s2);

然而在你的第二个片段中,你继续迭代同一个生成器(分配给变量f):

let f = func();
// first call to next
let s = f.next();
console.log(s);
// second call to next
let s2 = f.next();
console.log(s2);