返回

【手写 Promise 源码】第十五篇 - 了解 generator 生成器

前端

本篇文章,主要讲解了 generator 生成器函数的使用及其实现原理,内容涵盖:

  1. generator 特点、用法、作用分析。
  2. generator 实现原理分析。

想要将难懂的事情讲清楚,使用生成器就是一个好选择。

generator 生成器简介

generator 函数,是 ES6 中的新增语法,generator 函数与传统函数的最大区别是,generator 函数会返回一个迭代器对象。我们知道迭代器的本质是包含一个指针指向数据序列的起始位置,每当调用 iter.next() 函数,这个指针就向前移动一个位置,返回当前位置的数据值,直到数据序列被遍历完毕。

使用 generator 函数时,有以下特点:

  1. generator 虽然是函数,但跟传统函数不同,在函数体内定义好后,无法立即执行。
  2. 必须通过调用函数对象的 next() 方法才能执行生成器函数,每一次调用 next(),就会执行生成器函数的后续代码,遇到 yield 表达式停止执行并返回 yield 后面的值,暂停执行。
  3. 再次调用 next() 方法,generator 函数就会从 yield 表达式处继续执行,直到遇到下一个 yield 或者函数执行完毕为止。

generator 实现原理

generator 函数的实现原理,主要是靠一个特殊的属性 [[GeneratorStatus]] 和一个迭代器对象。

  1. [[GeneratorStatus]] 属性存储着生成器函数的执行状态。
  2. 生成器函数的实现,是将其标记为 [[GeneratorStatus]] 属性的值为 suspended 的一个迭代器对象。
  3. 迭代器对象包含指针,指向生成器函数体内的代码段,该代码段是从第一个 yield 表达式之后开始的。
  4. 当调用 generator 函数的 next() 方法时,迭代器对象的指针会指向下一条语句,并执行该语句,直到遇到下一个 yield 表达式或执行完毕。

总结

generator 生成器在很多场景下都有广泛的应用,比如说:

  1. 实现迭代器模式:生成器函数可以直接返回一个迭代器对象,使我们能够更容易地遍历数据序列。
  2. 异步编程:generator 函数可以暂停执行,等到异步操作完成后再继续执行,这使得异步编程变得更加容易。
  3. 状态机:generator 函数可以实现状态机,通过在生成器函数中使用 yield 表达式,我们可以很容易地实现状态切换。

总的来说,generator 生成器是一个非常强大的工具,可以帮助我们编写出更加清晰、高效和可维护的代码。