生成器函数(function)调用后返回迭代器而不执行,需调用next()才开始运行并暂停于yield;yield可多次中断恢复、保留上下文,其表达式返回外部传入的值;适用于同步迭代,异步需async function配合for await...of。

function* 声明的函数就是生成器函数,它不是一次性返回全部结果,而是按需产出值,每次调用 next() 就执行到下一个 yield 并暂停。
这和普通函数有本质区别:普通函数一调用就跑完、返回一个值(或 undefined);生成器函数调用后返回一个迭代器对象,你得手动驱动它一步步走。
生成器函数调用后不执行,只返回迭代器
这是最容易误解的一点。写好 function* gen() { console.log('start'); yield 1; },然后执行 gen() —— 控制台什么都不会打。
因为:
立即学习“Java免费学习笔记(深入)”;
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
-
gen()只创建并返回一个迭代器,不进入函数体 - 真正开始执行,要第一次调用返回对象的
next()
function* gen() {
console.log('start');
yield 1;
yield 2;
}
const it = gen(); // 没输出
it.next(); // 输出 'start',返回 { value: 1, done: false }
yield 不是 return,可以多次中断恢复
yield 会暂停执行,并把右侧表达式的值作为 value 返回;函数上下文(变量、执行位置)完整保留。下次 next() 时从中断处继续,不是重头来。
注意:yield 只能在生成器函数内部用,外层作用域写会报 SyntaxError: Unexpected strict mode reserved word。
- 不能在箭头函数里用
yield - 不能在普通
function里用yield -
yield表达式本身有返回值:外部传入next(value)的value会成为本次yield表达式的计算结果
function* gen() {
const x = yield 'first';
console.log('x:', x); // x: 'from next'
yield 'second';
}
const it = gen();
it.next(); // { value: 'first', done: false }
it.next('from next'); // 输出 'x: from next',{ value: 'second', done: false }
生成器函数适合处理异步流程或大数据流
它天然适配 for...of、Array.from()、展开运算符 [...gen()] 等可迭代协议场景,但要注意:如果生成器逻辑里有异步操作(比如 await),必须用 async function* —— 普通 function* 里不能直接 await,否则会当成字面量处理。
-
function*→ 同步迭代,yield是控制权让渡点 -
async function*→ 异步迭代,支持yield+await,返回的是AsyncIterator -
for await...of才能消费async function*产生的迭代器
async function* asyncGen() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
}
for await (const x of asyncGen()) {
console.log(x); // 1, 然后 2
}
生成器函数的核心价值不在“看起来高级”,而在于它把「执行控制权」从函数内部移交给了调用方。容易忽略的是:一旦生成器抛出未捕获错误,迭代器状态就变成 done: true,后续 next() 全部返回 { value: undefined, done: true } —— 这个静默终止行为,比想象中更难调试。










