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 表达式本身有返回值:它会把外部通过 
next(value) 传入的 value 作为本次 yield 表达式的计算结果。
-
it.next()(无参)时,yield表达式值为undefined -
it.next(42)时,当前yield左边的变量会接收到42,例如:const x = yield 1;→x变成42 - 每次
next()返回形如{ value: ..., done: ... }的对象,value是yield后面的值(或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用户注册登录功能快速实现【流程】

