搞定 ECMAScript 2020: Generator 函数的理解和使用方法讲解

阅读时长 5 分钟读完

随着 ECMAScript 的不断升级,语言的功能不断增强,在其中一个重要的新特性是 Generator 函数。Generator 函数能够让我们方便地创建迭代器,使得异步编程变得更加简单。在本文中,我们将详细讲解 Generator 函数的概念、用法、示例以及一些使用技巧。

概念介绍

Generator 函数是一个特殊的函数,其返回一个迭代器对象,可以通过调用其中的 next() 方法获取一个 Generator 对象中的一次“迭代”。在每次迭代中,都会执行函数中的代码,遇到 yield 关键字时会将其后的值返回作为本次迭代的值,下一次迭代从上次 yield 的位置重新开始执行。

使用方法

定义一个 Generator 函数,可以使用 function* 关键字进行定义,函数体内部通过 yield 关键字暂停函数执行并返回一个值,当再次调用 next 方法时,函数会从暂停的位置开始执行,直到遇到下一个 yield 或者执行完函数。

-- -------------------- ---- -------
--------- ------------- -
  ----- ---------
  ----- ---------
  ------ -------
-

----- --------- - --------------
------------------------------ -- - ------ --------- ----- ----- -
------------------------------ -- - ------ --------- ----- ----- -
------------------------------ -- - ------ ------- ----- ---- -

在上面的示例中,我们定义了一个名为 myGenerator 的 Generator 函数,其返回了三个值,分别是 value1、value2 和 done。

需要注意的是,如果函数中使用了 return 关键字,则会在最后一次迭代时将其后面的值返回,并设置 done 为 true。如果没有使用 return,则最后一次迭代的 done 为 true 时不会有返回值。

示例

实现一个生成斐波那契数列的 Generator 函数,并使用 for...of 循环遍历它。

-- -------------------- ---- -------
--------- ----------- -
  --- ------- - --
  --- ---- - --
  ----- ------ -
    ----- --------
    --------- ----- - ------ ------- - ------
  -
-

--- ------ --- -- ------------ -
  -- ---- - ---- ------
  -----------------
-

在上面的示例中,我们使用了一个 while(true) 循环,将两个变量 current 和 next 相加,每当调用 next 方法时,函数会执行到 yield 关键字暂停,并返回当前的值。在使用 for...of 循环遍历时,我们加上了一个判断,当值大于 100 时退出循环。

使用技巧

传递参数

在 generator 中可以使用函数调用时进行传参。在如下示例中,我们通过 next 方法传递了一个参数,并在函数体内部使用了它。

-- -------------------- ---- -------
--------- ------------- -
  ----- ---- - ----- ------- ---- -------
  ----- ------- ----------
-

----- --------- - --------------
------------------------------------ -- ------ ---- -----

------------------------------------------ -- ------ -----

链式调用

因为 next 方法的返回值是一个对象,所以我们可以使用链式调用的方式来简化代码。

-- -------------------- ---- -------
--------- ------------- -
  ----- ---------
  ----- ---------
  ------ -------
-

----- --------- - --------------
----------------------------------- -- ------
----------------------------------- -- ------
----------------------------------- -- ----

-- ----
----- ---------- - --------------
-------------------------------------------------- -- ----

合并生成器

我们可以通过 yield* 关键字将两个 generator 函数合并为一个。

-- -------------------- ---- -------
--------- -------------- -
  ----- ---------
  ----- ---------
-

--------- -------------- -
  ----- ---------
  ----- ---------
-

--------- ----------------- -
  ------ ---------------
  ------ ---------------
-

----------------------------------- -- - --------- --------- --------- -------- -

总结

Generator 函数是一个非常实用的编程技巧,它可以让我们更好地控制异步代码的执行流程。在使用过程中,我们需要注意 yield 和 return 的区别,并尽可能使用链式调用、传递参数和合并生成器来简化代码。通过对 Generator 函数的理解和使用,我们可以更高效地进行 JavaScript 编程。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6522977495b1f8cacda14cef

纠错
反馈