什么是 Generator 函数?

推荐答案

Generator 函数是 ES6 引入的一种特殊函数,它可以通过 function* 语法定义,并且可以使用 yield 关键字来暂停和恢复函数的执行。Generator 函数返回一个 Generator 对象,该对象遵循迭代器协议,可以通过 next() 方法逐步执行函数体中的代码。

本题详细解读

1. Generator 函数的定义

Generator 函数使用 function* 语法定义,函数体内可以使用 yield 关键字来暂停函数的执行,并返回一个值。每次调用 next() 方法时,函数会从上次暂停的地方继续执行,直到遇到下一个 yield 或函数结束。

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

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

2. Generator 函数的执行过程

Generator 函数不会立即执行,而是返回一个 Generator 对象。调用 next() 方法时,函数会从上次暂停的地方继续执行,直到遇到 yieldreturn 语句。yield 会暂停函数执行并返回一个值,而 return 会结束函数执行并返回一个值。

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

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

3. Generator 函数的应用场景

Generator 函数常用于异步编程、惰性求值、无限序列等场景。通过 yieldnext() 的配合,可以实现复杂的控制流。

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

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

4. Generator 函数与迭代器的关系

Generator 函数返回的 Generator 对象实现了迭代器协议,因此可以使用 for...of 循环来遍历 Generator 函数生成的值。

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

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

5. Generator 函数的错误处理

Generator 函数可以通过 throw() 方法在函数体内抛出错误,并通过 try...catch 捕获错误。

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

----- --- - --------------
------------------------------ -- -- -
------------- ---------------- ---- --------- -- -- ------ ------- ------ --------- ---- ------
纠错
反馈