箭头函数不能用作生成器函数,因其无function关键字、不支持语法和yield;生成器必须以function声明;箭头函数内不可用yield;复用逻辑应封装为独立生成器并用yield*委托。

箭头函数不能用作生成器函数,这是最核心的语法限制——因为箭头函数没有 function 关键字,不支持 * 语法,也无法使用 yield。
箭头函数根本不能声明为生成器
生成器函数必须显式以 function* 开头(或作为方法时用 *methodName()),而箭头函数语法形如 () => {},中间无法插入 *。以下写法全部报错:
-
const gen = () =>* { yield 1; };→ 语法错误(*位置非法) -
const gen = () => { yield 1; };→ 运行时报错(yield在非生成器上下文中无效) -
const gen = () => function*() { yield 1; };→ 返回的是一个生成器函数,但箭头函数本身不是生成器
在生成器内部谨慎使用箭头函数
生成器函数体内可以定义箭头函数,但要注意:箭头函数不绑定 this、没有 arguments、也不能用 yield 直接委托。常见误区包括:
- 误以为箭头函数里能直接
yield:不行,yield只在生成器函数作用域有效 - 在箭头函数中调用
yield或yield*:会报ReferenceError: yield is not defined - 用箭头函数封装异步逻辑并期望它“暂停”执行:箭头函数不具备暂停/恢复能力,需靠外部生成器控制流程
替代方案:用普通函数 + 显式 yield* 委托
若想复用逻辑,应把可迭代行为封装成独立生成器函数,再用 yield* 委托调用:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
function* numbers() {
yield 1;
yield 2;
}
<p>function<em> main() {
yield 'start';
yield</em> numbers(); // ✅ 正确委托
yield 'end';
}避免写成:
function* main() {
yield 'start';
const helper = () => { yield 1; }; // ❌ yield 无效
helper();
}需要闭包场景?优先用普通函数表达式
当需要捕获外层变量又想支持 yield 时,别用箭头函数,改用带 * 的函数表达式:
function createCounter(max) {
return function* () {
for (let i = 0; i < max; i++) {
yield i;
}
};
}
<p>const counterGen = createCounter(3)();
console.log([...counterGen]); // [0, 1, 2]这里返回的是一个生成器函数,不是箭头函数——既保持了闭包,又合法支持 yield。

















