返回
【手写 Promise 源码】第十五篇 - 了解 generator 生成器
前端
2023-12-25 22:55:02
本篇文章,主要讲解了 generator 生成器函数的使用及其实现原理,内容涵盖:
- generator 特点、用法、作用分析。
- generator 实现原理分析。
想要将难懂的事情讲清楚,使用生成器就是一个好选择。
generator 生成器简介
generator 函数,是 ES6 中的新增语法,generator 函数与传统函数的最大区别是,generator 函数会返回一个迭代器对象。我们知道迭代器的本质是包含一个指针指向数据序列的起始位置,每当调用 iter.next() 函数,这个指针就向前移动一个位置,返回当前位置的数据值,直到数据序列被遍历完毕。
使用 generator 函数时,有以下特点:
- generator 虽然是函数,但跟传统函数不同,在函数体内定义好后,无法立即执行。
- 必须通过调用函数对象的 next() 方法才能执行生成器函数,每一次调用 next(),就会执行生成器函数的后续代码,遇到 yield 表达式停止执行并返回 yield 后面的值,暂停执行。
- 再次调用 next() 方法,generator 函数就会从 yield 表达式处继续执行,直到遇到下一个 yield 或者函数执行完毕为止。
generator 实现原理
generator 函数的实现原理,主要是靠一个特殊的属性 [[GeneratorStatus]] 和一个迭代器对象。
- [[GeneratorStatus]] 属性存储着生成器函数的执行状态。
- 生成器函数的实现,是将其标记为 [[GeneratorStatus]] 属性的值为 suspended 的一个迭代器对象。
- 迭代器对象包含指针,指向生成器函数体内的代码段,该代码段是从第一个 yield 表达式之后开始的。
- 当调用 generator 函数的 next() 方法时,迭代器对象的指针会指向下一条语句,并执行该语句,直到遇到下一个 yield 表达式或执行完毕。
总结
generator 生成器在很多场景下都有广泛的应用,比如说:
- 实现迭代器模式:生成器函数可以直接返回一个迭代器对象,使我们能够更容易地遍历数据序列。
- 异步编程:generator 函数可以暂停执行,等到异步操作完成后再继续执行,这使得异步编程变得更加容易。
- 状态机:generator 函数可以实现状态机,通过在生成器函数中使用 yield 表达式,我们可以很容易地实现状态切换。
总的来说,generator 生成器是一个非常强大的工具,可以帮助我们编写出更加清晰、高效和可维护的代码。