JavaScript ES6生成器中的yield关键字是如何工作的?

6

我正在学习ES6中的生成器,想要从概念上理解下面这个函数中发生了什么:

function* createNames() {
    const people = [];

    people.push(yield);
    people.push(yield);
    people.push(yield);

    return people;
}

const iterator = createNames();
iterator.next('Brian');
iterator.next('Paul');
iterator.next('John');
iterator.next(); // output: ["Paul", "John", undefined]

我的问题是:为什么第一次推送被忽略了?数组不应该像people = ['Brian', 'John', 'Paul', undefined]这样吗?抱歉问一个愚蠢的问题,但我真的很想完全理解这个。提前谢谢!

1
这是有意设计的。迭代器将控制权反转给调用者,因此允许对集合进行惰性迭代。如果调用生成器函数会立即改变迭代器的状态,则会破坏这种语义。 - user6445533
1个回答

4

调用 createNames() 不会执行生成器内的任何代码。它创建一个迭代器实例,并在第一次调用 next() 时开始执行。

const iterator = createNames(); 
// Iterator instance created, but hasn't executed yet.

iterator.next('Brian');
// creates the people array
// attempts to push, yields
iterator.next('Paul');
// pushes 'Paul'
// attempts to push, yields
iterator.next('John');
// pushes 'John'
// attempts to push, yeilds
iterator.next(); 
// pushes undefined
// returns ["Paul", "John", undefined]

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