JavaScript生成器函数

生成器函数,说白了,就是一种特殊的函数,它可以暂停执行,并在需要的时候再从暂停的地方继续执行。这种"走走停停"的特性,是普通函数完全不具备的。定义一个生成器函数非常简单,在关键字后面加一个星号(*)就行,就像这样:。函数体内部会使用一个全新的关键字,这个就是"产出一个值并暂停"的指令。

光说不练假把式,来看一个最简单的例子,理解一下它到底是怎么工作的:

看到了吗?当你调用时,它并不会立刻执行函数体内的代码,而是返回一个被称为"生成器对象"的迭代器。这个对象有一个核心方法。每次调用,函数就会从上次暂停的地方(或者开头)开始执行,直到遇到下一个或。

表达式会产出一个值,这个值会成为方法返回对象的属性。同时,函数执行在此处暂停。返回对象的属性告诉你迭代是否已经结束。当遇到语句时,会变为,并且的值会作为最终的。如果没有,那么最后返回的就是。

生成器最强大的地方在于它实现了"惰性求值"(Lazy Evaluation)。想象一下,你需要一个从1到1亿的计数器。如果用普通函数,你可能会先创建一个包含1亿个元素的数组,这无疑是个内存杀手。而用生成器,就优雅多了:

这种特性在处理大规模数据、无限序列或者异步编程(配合和Promise,这是后话)时,优势是压倒性的。

除了手动调用,生成器对象因为是迭代器,所以可以直接被循环消费,这大大简化了我们的操作。

生成器的另一个高级特性是支持双向通信。方法不仅可以获取值,还可以向生成器内部传递参数。这个参数会作为上一次表达式整体的返回值。

这个特性让生成器变得更加灵活和强大,可以用于实现更复杂的控制流,比如像协程(Coroutine)一样。

那么,生成器到底用在什么地方呢?说实话,应用场景非常广泛。

高效处理大数据集:前面已经举过例子了,无论是读取一个巨大的文件,还是遍历数据库查询结果,都可以用生成器来分批处理,避免内存溢出。

实现无限数据流:由于是惰性的,生成器可以轻松表示无限序列。

简化异步流程控制:虽然现在已经成为了主流,但它的底层思想与生成器密切相关。在早期,我们可以利用生成器(配合像co这样的库)来以同步的方式编写异步代码,解决"回调地狱"的问题。

状态机:生成器函数内部的状态(局部变量)在暂停和恢复之间是被完整保存的,这使得它非常适合用来实现状态机。

总而言之,JavaScript的生成器函数是一个被低估但极其强大的工具。它通过引入"暂停"和"恢复"的能力,为我们提供了一种全新的函数封装和流程控制思路。在处理迭代问题,特别是那些需要按需计算、内存敏感的场景时,生成器绝对是你工具箱里的一把利器。下次当你面临需要"慢慢来"的数据生成任务时,不妨试试它,相信你会被它的优雅和高效所折服。

相关推荐
佐伊232 天前
SQL优化剧场:当Hive/MaxCompute遇上数据倾斜的十二种剧情
hive·sql优化·maxcompute·数据倾斜
Amber勇闯数分2 天前
【Hive】基于物品协同过滤 [ ItemCF ] 推荐课程-余弦相似度计算
大数据·数据仓库·hive·hadoop·矩阵
努力有什么不好2 天前
SparkSQL如何查询外部hive数据
数据仓库·hive·hadoop
yumgpkpm2 天前
华为昇腾300T A2训练、微调Qwen过程,带保姆式命令,麒麟操作系统+鲲鹏CPU
hive·hadoop·华为·flink·spark·kafka·hbase
無森~2 天前
HBase与MR、Hive整合
hive·hbase·mr
Gain_chance4 天前
32-学习笔记尚硅谷数仓搭建-DWD层首日数据装载脚本及每日数据装载脚本
大数据·数据仓库·hive·笔记·学习
Gain_chance4 天前
29-学习笔记尚硅谷数仓搭建-DWD层交易域下单事务事实表和交易域支付成功事务事实表
数据仓库·hive·笔记·学习·datagrip
北亚数据恢复4 天前
分布式数据恢复—Ceph+TiDB数据恢复报告
分布式·ceph·数据恢复·tidb·服务器数据恢复·北亚数据恢复·存储数据恢复
TTBIGDATA4 天前
【Ranger】Ambari开启Kerberos 后 ,Ranger 中 Hive 策略里,Resource lookup fail 线程池超时优化
大数据·数据仓库·hive·hadoop·ambari·hdp·ranger
麦兜*5 天前
深入解析分布式数据库TiDB核心架构:基于Raft一致性协议与HTAP混合负载实现金融级高可用与实时分析的工程实践
数据库·分布式·tidb