介绍
生成器(Generator)是 ES6 中新增的一种函数类型,它的作用是在函数执行过程中暂停执行,并且可以在暂停的过程中向函数传递数据。在 ES6 之前,实现这种暂停执行的功能只能通过回调函数或者 Promise 来实现,而生成器则提供了一种更为简单、直观的方式。
基本语法
生成器函数使用 function*
关键字来定义,其基本语法如下:
function* generator() { // 函数体 }
在生成器函数中,可以使用 yield
关键字来暂停函数的执行,并将一个值传递给调用方。例如:
-- -------------------- ---- ------- --------- ----------- - ----- -- ----- -- ----- -- - ----- - - ------------ ---------------------- -- - ------ -- ----- ----- - ---------------------- -- - ------ -- ----- ----- - ---------------------- -- - ------ -- ----- ----- - ---------------------- -- - ------ ---------- ----- ---- -展开代码
在上面的例子中,我们定义了一个生成器函数 generator
,并通过 yield
关键字暂停了函数的执行,并分别传递了值 1、2 和 3 给调用方。在调用方使用 next()
方法继续执行生成器函数时,函数会从上一次暂停的位置继续执行,直到遇到下一个 yield
关键字或者函数执行结束。
生成器的应用
生成器的应用非常广泛,下面我们来介绍一些常见的用法。
生成器的迭代器
在上面的例子中,我们使用 next()
方法来迭代生成器函数,这是因为生成器函数本身就是一个迭代器。因此,我们可以使用 for...of
循环来迭代生成器函数,例如:
-- -------------------- ---- ------- --------- ----------- - ----- -- ----- -- ----- -- - --- ------ ----- -- ------------ - ------------------- - -- - -- - -- -展开代码
在上面的例子中,我们使用 for...of
循环来迭代生成器函数 generator
,并依次输出每个值。
生成器的嵌套
生成器函数可以嵌套调用,这样可以使代码更加简洁、易于理解。例如:
-- -------------------- ---- ------- --------- ---------------- - ----- -- ----- -- - --------- ---------------- - ----- -- ------ ----------------- ----- -- - --- ------ ----- -- ----------------- - ------------------- - -- - -- - -- - -- -展开代码
在上面的例子中,我们定义了两个生成器函数 innerGenerator
和 outerGenerator
,并通过 yield*
关键字来嵌套调用 innerGenerator
。在 for...of
循环中迭代 outerGenerator
函数时,依次输出每个值。
生成器的异步编程
生成器函数可以与 Promise 结合使用,实现异步编程。例如:
-- -------------------- ---- ------- -------- ----------- - ------ --- --------------- -- - ------------- -- - ---------------- -- ------ --- - --------- ----------- - ----- ---- - ----- ------------ ------------------ - ----- - - ------------ ----- ------- - --------------- ----------------- -- - ------------- ---展开代码
在上面的例子中,我们定义了一个异步函数 fetchData
,并在生成器函数中使用 yield
关键字暂停函数的执行,等待异步函数返回数据。在调用方中,我们通过 next()
方法获取生成器函数的返回值,并将其传递给异步函数,等待异步函数完成后继续执行生成器函数。
总结
生成器是 ES6 中新增的一种函数类型,它可以在函数执行过程中暂停执行,并且可以在暂停的过程中向函数传递数据。生成器的应用非常广泛,包括生成器的迭代器、生成器的嵌套和生成器的异步编程等。学习生成器可以让我们更加深入地了解 JavaScript 的底层机制,同时也可以提高我们的编程效率和代码质量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/657867aed2f5e1655d251b91