Generator函数可通过yield暂停并恢复执行,返回迭代器对象,每次next()调用返回value和done属性,实现惰性求值与双向通信,曾用于异步控制、生成无限序列等场景。

Generator 是 JavaScript 中一种特殊的函数,它能暂停执行,也可以在需要时恢复,还能多次返回值。和普通函数不同,普通函数一旦开始运行就会一直执行到结束,而 Generator 函数可以在执行过程中“中途暂停”,之后再从中断的地方继续。
Generator 函数的基本语法
定义一个 Generator 函数很简单,只需要在 function 关键字后加一个星号 (*),然后在函数体内使用 yield 来指定暂停点:
function* myGenerator() {
console.log("第一步");
yield "第一次暂停";
console.log("第二步");
yield "第二次暂停";
return "结束";
}
调用这个函数并不会立即执行它的代码,而是返回一个 遍历器对象(Iterator):
const gen = myGenerator();
gen.next(); // 输出 "第一步",返回 { value: "第一次暂停", done: false }
gen.next(); // 输出 "第二步",返回 { value: "第二次暂停", done: false }
gen.next(); // 返回 { value: "结束", done: true }
yield 和 next 的交互机制
Generator 的核心是 yield 和 next() 配合实现的双向通信:
- yield 暂停函数,并把一个值返回给外部
- next() 恢复执行,还可以传入参数,作为上一个 yield 表达式的返回值
例子:
自从百度屏蔽淘宝客网站、淘宝抛弃淘宝客之后,个人站长集体陷入了恐慌之中。此时,什么值得买网的异军突起引起了广大个人站长的极大关注。做一个什么值得买一样的导购网站成了众多个人站长的一致心愿! TP-COUPON 导购系统 即是让个人站长实现此心愿的绝佳选择! 欢迎个人站长选用。V1.1版 更新记录:1.修正请求时查询淘宝店铺错误的bug2.删除一些无用的代码
function* sayHello() {
const name = yield "请输入名字";
console.log("你好," + name);
}
const g = sayHello();
g.next(); // { value: "请输入名字", done: false }
g.next("小明"); // 输出 "你好,小明",{ value: undefined, done: true }
应用场景
虽然现在异步主流用 async/await,但 Generator 曾经被广泛用于:
- 手动控制异步流程(配合 co 库等)
- 生成无限序列(比如斐波那契数列)
- 状态机管理
- 惰性求值,逐个生成数据,节省内存
例如生成斐波那契数列:
function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
const fib = fibonacci();
fib.next().value; // 0
fib.next().value; // 1
fib.next().value; // 1
fib.next().value; // 2
基本上就这些。Generator 提供了一种更灵活的函数控制方式,虽然日常开发中直接使用的场景不多,但理解它有助于深入掌握 JS 的异步机制和迭代器原理。不复杂但容易忽略。









