Generator函数调用后立即返回一个标准迭代器对象,该对象原生实现ES6迭代协议(含next()方法并返回{value,done})、可被for…of等直接消费、兼具可迭代与迭代器双重身份,其执行完全受next()调用节奏控制,且由引擎隐式构造,无需手动实现。

Generator 函数调用后不执行逻辑,也不返回计算结果,而是**立即返回一个标准迭代器对象**——这个对象天然满足 JavaScript 的迭代协议(即具备 next() 方法,且每次调用返回 { value, done } 结构的对象)。它不是“模拟”迭代器,而是语言层面原生实现的、合规的迭代器。
它为什么是“标准迭代器”
该对象实现了 ES6 迭代器协议所要求的核心能力:
- 拥有 next() 方法,且每次调用都严格返回形如
{ value: ..., done: true|false }的对象 - 可被
for...of直接消费,无需额外封装(因为for...of内部就是靠调用next()驱动的) - 可传入
Array.from()、Promise.all()(配合Array.from(gen))、yield*等接受可迭代对象(Symbol.iterator)的上下文 - 其原型链上存在
[Symbol.iterator]()方法,且该方法返回自身(即它既是迭代器,也是可迭代对象)
它为什么是“受控”的
所谓“受控”,是指函数体的执行完全由外部对 next() 的调用节奏决定:
- 首次调用
next():从函数开头执行,直到遇到第一个yield或return,暂停并返回当前值 - 后续每次调用
next():从上次暂停处继续,走到下一个yield或函数结束 - 没有外部调用,函数体就永远“冻结”在某个中间状态,不会自动推进
- 甚至可以跳过某些
yield(比如只调两次next()就停住),或注入值(next(value)会把value作为上一个yield表达式的返回值)
它为什么是“隐式返回”的
你不需要手动 return new Iterator(...),也不需要自己实现 next() 方法。只要写 function*,JS 引擎就在调用时自动构造并返回这个对象:
- 语法糖背后是引擎内置的迭代器工厂
- 即使函数体为空(
function* () {}),调用后仍得到合法迭代器,首次next()即返回{ value: undefined, done: true } - 所有状态(变量、执行位置、堆栈帧)都被封装在该对象内部,对外不可见但完全受控
本质上,Generator 函数是语言为“按需分步执行 + 状态快照保存”提供的第一等抽象;它返回的那个对象,就是这个抽象落地的标准接口载体。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/jiquanzatan/123691.html