知识卡片

生成器实现惰性求值的处理管道

专业/工作 · 420

内容

用yield定义的生成器函数每次调用不是立刻跑完整个函数体,而是返回一个记住自身执行位置的生成器对象,调用一次next()才往前推进到下一个yield处并交出一个值,函数的其余状态原地挂起等待下次唤醒。这种”按需产出一个值”的特性天然适合搭建处理管道:把”按行拆分”、”去除首尾空格”、”过滤空行和注释”这几步分别写成生成器函数,一个套一个地包起来,数据不会被一次性物化成完整的中间数组,而是像流水线一样一条数据从头到尾流过所有环节才轮到下一条。这种懒惰求值模式的价值在于面对可能无穷或极大的数据源时(比如实时流、巨大文件)只按实际消费的量做计算,不会因为提前构建全量的中间结果而浪费内存和时间,是[[闭包实现真正无法绕过的私有状态]]之外JavaScript函数式编程能力的另一个体现。

参考来源

《JavaScript权威指南(原书第6版)》第11章《JavaScript的子集和扩展》