为何JavaScript生成器函数第三次调用next()时done才为true?
生成器函数next()调用的状态逻辑疑问
代码示例
function* cal() { yield 3; yield 5; } let calu = cal(); console.log(calu.next()) console.log(calu.next()) console.log(calu.next())
运行结果
{ value: 3, done: false } { value: 5, done: false } { value: undefined, done: true }
问题
为何生成器函数在第三次调用next()时done才为true,而非第二次?
这得从生成器的执行机制说起:
- 生成器函数调用后不会立刻执行,只会返回一个迭代器对象,只有调用
next()才会驱动函数执行。 - 第一次调用
next():函数执行到第一个yield 3就暂停,此时函数还没执行完,所以返回done: false,同时产出值3。 - 第二次调用
next():函数从上次暂停的位置继续,走到第二个yield 5又暂停,这时函数依然没走到终点,所以还是返回done: false,产出值5。 - 第三次调用
next():函数从第二个yield之后继续执行,直到整个函数体结束,此时生成器没有更多可执行的内容了,才会返回done: true,因为没有额外的return语句,所以value是undefined。
核心点就是:yield的作用是“产出值并暂停执行”,每次yield只会让函数暂停,而非结束。只有当next()调用后,函数执行到函数的末尾(或者遇到return),才会标记done: true。你的生成器里有两个yield,前两次next()都停在yield节点,第三次才走完整个函数流程。
内容的提问来源于stack exchange,提问作者Prashant Sakre
相关产品推荐
相关产品推荐

