新闻中心

J*aScript Generator函数详解

2025-10-21
浏览次数:
返回列表
Generator函数是通过function*定义并返回迭代器的对象,利用yield暂停执行和next()恢复运行,实现异步控制与惰性求值,支持双向通信及错误处理,适用于状态机、无限序列生成等场景。

javascript generator函数详解

Generator函数是J*aScript中一种特殊的函数类型,能够实现函数的暂停与恢复执行,为异步编程和迭代控制提供了强大支持。它不像普通函数那样一次性运行完毕,而是可以在执行过程中多次暂停,并在需要时继续执行。

什么是Generator函数

Generator函数通过 function* 语法定义,调用后返回一个遍历器对象(Iterator),该对象遵循迭代器协议,具备 next() 方法来逐步驱动函数体内的执行。

函数内部使用 yield 关键字来定义暂停点。每次调用 next(),函数会从上次暂停处继续运行,直到遇到下一个 yield 或函数结束。

示例:

function* myGenerator() {
  console.log("第一步");
  yield "A";
  console.log("第二步");
  yield "B";
  console.log("完成");
  return "结束";
}

const gen = myGenerator();
gen.next(); // 输出"第一步",返回 { value: "A", done: false }
gen.next(); // 输出"第二步",返回 { value: "B", done: false }
gen.next(); // 输出"完成",返回 { value: "结束", done: true }

yield与next的交互机制

yield 不仅用于输出值,还可以接收外部传入的数据。通过 next(value) 方法,可以向 Generator 函数体内传递参数,实现双向通信。

注意:第一次调用 next() 通常不建议传参,因为没有对应的 yield 接收初始值(除非特别设计)。从第二次开始,传入的值会替换上一个 yield 表达式的返回结果。

示例:双向数据传递

明仔PHP零基础(一日通) 明仔PHP零基础(一日通)

明仔PHP零基础(一日通)教程都是PHP基础,全部带详细注释,能让新接触者很容易看懂,和几个基础例子,包括登陆,数组,函数,分页的详解。

明仔PHP零基础(一日通) 338 查看详情 明仔PHP零基础(一日通)

function* counter() {
  let count = 0;
  while (true) {
    const reset = yield count++;
    if (reset) count = 0;
  }
}

const iter = counter();
iter.next(); // { value: 0, done: false }
iter.next(); // { value: 1, done: false }
iter.next(true); // { value: 0, done: false },重置计数

return与throw方法

除了 next(),Generator 实例还提供 return() 和 throw() 方法来控制流程。

  • return(value):结束生成器执行,返回指定值,并使 done 为 true。后续 yield 将不再生效。
  • throw(error):在暂停点抛出异常,可在函数内使用 try...catch 捕获处理。

示例:提前终止与错误处理

function* errorDemo() {
  try {
    yield "正常执行";
  } catch (e) {
    console.log("捕获错误:", e.message);
  }
}

const g = errorDemo();
g.next(); // { value: "正常执行", done: false }
g.throw(new Error("出错了")); // 控制台输出“捕获错误: 出错了”

应用场景与实际用途

虽然现代异步主要依赖 async/await,但 Generator 在特定场景仍有价值。

  • 惰性求值序列:生成无限序列(如斐波那契数列),按需计算。
  • 状态机:利用 yield 切换状态,逻辑清晰。
  • 中间件流程控制:Koa1 使用 Generator 实现洋葱模型,虽然后续版本改用 Promise。
  • 测试模拟异步流程:便于控制执行节奏。

示例:无限斐波那契生成器

function* fibonacci() {
  let [prev, curr] = [0, 1];
  while (true) {
    yield curr;
    [prev, curr] = [curr, prev + curr];
  }
}

const fib = fibonacci();
fib.next().value; // 1
fib.next().value; // 1
fib.next().value; // 2
fib.next().value; // 3
// 可持续调用,按需生成

基本上就这些。Generator 提供了对函数执行的精细控制能力,理解其机制有助于深入掌握 J*aScript 的执行模型和异步原理。虽然日常开发中使用不多,但在底层库或复杂控制流中仍具实用价值。

以上就是J*aScript Generator函数详解的详细内容,更多请关注其它相关文章!


# 按需  # 三门峡营销推广系统公司  # 承德网站建设定制公司  # 苏州网站推广罗浩  # 网络seo外包  # 南宁学seo  # 太原网站关键词排名优化  # 新乡抖音seo推荐  # 品牌的营销推广英文翻译  # 嘉峪关seo公司询问13火星  # 整合营销大数据推广策略  # 体内  # javascript  # 如何实现  # 有什么不同  # 如何使用  # 第二步  # 方法来  # 迭代  # 可选  # 错了  # ai  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  《主播少女的秘密账号迷宫》首支宣传片  在Qt QML中通过Python字典动态更新TextEdit内容的教程  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  Excel文件在线转换快速入口 Excel在线格式转换网站  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  Mac怎么查看崩溃日志_Mac控制台错误报告分析  抖音网页版快捷访问 抖音网页版网页版入口操作教程  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  Django模型中自动计算可用余额的实现方法  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  理解Python模块与全局变量的作用域管理  Python自定义类排序:解决lambda键值访问TypeError的实践指南  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  Python多线程中正确使用sigwait处理SIGALRM信号  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  ArrayList与LinkedList核心操作的Big-O复杂度分析  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  html5 app怎么运行环境_配html5 app运行环境【教程】  163邮箱登录密码 163邮箱忘记密码找回  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  新三国志曹操传110级星符试炼夏侯渊极难攻略  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  押井守高度称赞《辐射4》:玩了八年都停不下来!  Lar*el递归关系中排除子孙节点的策略  steam官方入口大全 steam账号注册及操作指南  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  小米14应用无法联网原因分析_小米14网络权限修复 

搜索