yield是生成器函数中暂停执行并返回值的关键字,遇yield暂停并返回{value:..., done:false},next()恢复执行,传参可赋值给yield左侧变量;return则终止生成器并设done:true。

yield 是 JavaScript 中用于生成器函数(Generator Function)的关键字,它不暂停普通函数,只在 function* 定义的生成器中起作用——执行到 yield 时会暂停函数,把右侧表达式的值作为迭代结果返回;下次调用 next() 时才从暂停处继续执行。
yield 怎么让函数暂停
生成器函数不会立即执行,而是返回一个迭代器对象。只有调用该迭代器的 next() 方法时,函数体才开始运行,直到遇到第一个 yield 就暂停,并返回一个形如 { value: ..., done: false } 的对象:
- 暂停点严格落在 yield 表达式之后(不是语句末尾),即 yield 后面的值被产出,函数状态(如变量、执行位置)被保留
- 后续再次调用
next(),函数从 yield 下一行恢复,而非重新开始 - 若 yield 后面是表达式(如
yield x + 1),则该表达式在每次next()调用时才求值
yield 怎么配合 next() 恢复执行
每次调用迭代器的 next() 方法,都会唤醒暂停的生成器:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一次
next():从头执行,到第一个 yield 暂停,返回 yield 右侧的值 - 第二次
next():从上次 yield 后继续,执行到下一个 yield 或函数结束 -
next(arg)中传入的参数,会成为上一个 yield 表达式的返回值(即赋给yield左侧的变量,如果存在)
例如:let x = yield 1; 第一次 next() 返回 {value: 1, done: false};第二次调用 next(42),则 x 被赋值为 42,然后继续向下执行。
yield 和 return 的区别
生成器中可以同时使用 yield 和 return,但行为不同:
-
yield 暂停并产出一个值,
done: false,函数可再次恢复 -
return 终止生成器,产出的值设为
value,且done: true,后续再调用next()都返回{value: undefined, done: true} - 函数末尾隐式
return也等价于return undefined,触发完成状态
实际中容易忽略的关键点
yield 的暂停/恢复不是异步调度,也不涉及事件循环;它完全由迭代器控制,是同步的协程机制:
- 没有 yield 的函数即使加了
*也是生成器,但调用next()会直接完成(done: true) - yield 只能出现在生成器函数内部,嵌套在普通函数里会报语法错误
- 不能在箭头函数中使用 yield,也不能在生成器内部用
await(除非用async function*,此时用await和yield是两种不同暂停机制)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










