箭头函数不能使用 yield,因其语法不支持 function 声明且无迭代器协议能力,设计上也刻意舍弃生成器功能,需改用 function 实现。

箭头函数不能使用 yield 关键字,根本原因在于它的语法设计和运行机制与 Generator 函数完全不兼容。
语法层面:yield 只在 function* 函数体内合法
yield 是 Generator 函数的专属关键字,JavaScript 引擎只允许它出现在用 function* 声明的函数内部。箭头函数没有 function 关键字,也不支持 * 修饰符,因此引擎在解析时会直接报错:
-
() => { yield 1; }→ SyntaxError: Unexpected reserved word -
const gen = () => function*() { yield 1; };→ 这只是返回一个 generator 函数,并非箭头函数本身是 generator
执行机制:箭头函数不具备迭代器协议能力
Generator 函数调用后返回一个迭代器对象(含 next() 方法和 [Symbol.iterator]),而箭头函数即使返回一个对象,也默认不满足迭代器协议:
- 箭头函数没有内置的暂停/恢复执行能力
- 它不能保存执行上下文(如变量状态、yield 位置),而 generator 必须能多次调用
next()并逐步产出值 - 即使手动返回
{ next() { ... } },也只是模拟,不是真正的 generator
设计定位:箭头函数本就不承担协程或惰性求值职责
箭头函数的初衷是简化短小、无状态、无上下文依赖的回调,比如数组遍历中的 map 或 filter 参数。它刻意舍弃了以下能力:
- 自己的
this、arguments、super、new.target - 作为构造函数的能力(
new不可用) - 生成器能力(
yield不可用)
这些“缺失”不是缺陷,而是设计取舍——把复杂功能留给 function*,把简洁写法留给箭头函数。
替代方案:该用 function* 的地方就别硬套箭头函数
如果需要生成器行为,请明确使用 function*:
- ✅ 正确:
function* numbers() { yield 1; yield 2; } - ✅ 对象中定义:
{ getValues: function*() { yield 'a'; yield 'b'; } } - ❌ 错误:
{ getValues: () => { yield 'a'; } }(语法错误) - ❌ 错误:
{ getValues: *() { yield 'a'; } }(语法非法,不能省略function)
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











