javascript生成器是什么_yield关键字怎么用【教程】

发布时间 - 2026-01-22 00:00:00    点击率:
生成器函数用function*声明,调用返回迭代器,需next()触发执行;yield暂停并交出控制权,可接收next传入值;return终止生成器;不可重用,非为替代循环而生。

JavaScript 生成器不是普通函数,它能暂停执行、交出控制权,并在后续恢复——yield 就是这个暂停和交出的指令。

生成器函数怎么声明和调用?

生成器函数必须用 function* 声明(星号紧贴 function 关键字),调用后不立即执行,而是返回一个迭代器对象。

  • 错误写法:function myGen() { yield 1; } → 语法报错,缺少 *
  • 正确写法:function* myGen() { yield 1; yield 2; }
  • 调用后得到的是迭代器:const it = myGen();,此时函数体未运行
  • 真正触发执行要靠 it.next(),第一次调用才开始运行到第一个 yield

yield 返回什么?怎么接收传入值?

yie

ld 表达式本身有返回值:它会把外部通过 next(value) 传入的 value 作为本次 yield 表达式的计算结果。

  • it.next()(无参)时,yield 表达式值为 undefined
  • it.next(42) 时,当前 yield 左边的变量会接收到 42,例如:const x = yield 1;x 变成 42
  • 每次 next() 返回形如 { value: ..., done: ... } 的对象,valueyield 后面的值(或 return 的值),done 表示是否结束

生成器里能用 return 吗?和 yield 有什么区别?

可以,但语义不同:return 表示生成器彻底结束,后续 next() 调用都返回 { value: undefined, done: true };而 yield 是暂停,还能继续。

  • yield 1; → 返回 { value: 1, done: false }
  • return 2; → 返回 { value: 2, done: true }
  • 如果生成器函数体结束没写 return,最后一步自动返回 { value: undefined, done: true }
  • throw()return() 方法也能强制结束生成器,但会跳过后续 yield

常见误用和性能注意点

生成器不是为替代循环而生的,它的核心价值在于“可中断的同步逻辑”或手动控制异步流程(比如早期 co 库)。滥用会导致可读性下降和意外状态。

  • 不要在箭头函数里用 function* —— 箭头函数不能是生成器
  • yield 只能在生成器函数内使用,嵌套普通函数里直接报 Uncaught SyntaxError: Unexpected identifier
  • 生成器对象不可重用:一旦 done: true,再次 next() 永远返回 { value: undefined, done: true }
  • V8 对生成器有优化,但大量短生命周期生成器(比如每次渲染都新建)可能比数组 map 慢,别为了“酷”硬套

最易被忽略的一点:生成器的“暂停点”只存在于 yield 表达式求值完成之后,不是语句开头;也就是说,yield foo() 会先执行 foo(),再暂停并返回其结果——这决定了副作用发生的时机。


# javascript  # java  # 区别 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何有效防御Web建站篡改攻击?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  清除minerd进程的简单方法  活动邀请函制作网站有哪些,活动邀请函文案?  如何构建满足综合性能需求的优质建站方案?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  黑客如何利用漏洞与弱口令入侵网站服务器?  微信h5制作网站有哪些,免费微信H5页面制作工具?  利用python获取某年中每个月的第一天和最后一天  郑州企业网站制作公司,郑州招聘网站有哪些?  Python文件操作最佳实践_稳定性说明【指导】  北京企业网站设计制作公司,北京铁路集团官方网站?  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  js实现获取鼠标当前的位置  Laravel如何使用Livewire构建动态组件?(入门代码)  linux写shell需要注意的问题(必看)  详解Oracle修改字段类型方法总结  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  jquery插件bootstrapValidator表单验证详解  免费视频制作网站,更新又快又好的免费电影网站?  制作电商网页,电商供应链怎么做?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  浅谈Javascript中的Label语句  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  html如何与html链接_实现多个HTML页面互相链接【互相】  如何快速搭建高效服务器建站系统?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何在服务器上配置二级域名建站?  如何在阿里云高效完成企业建站全流程?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  网站制作软件有哪些,制图软件有哪些?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何在万网ECS上快速搭建专属网站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel怎么判断请求类型_Laravel Request isMethod用法  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何用搬瓦工VPS快速搭建个人网站?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  如何在阿里云香港服务器快速搭建网站?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】