生成器 - 精细的图形部分

ECMAScript 6 草稿规范已经为现代 JavaScript 开发者带来了许多福音。我们在上篇文章中介绍了一些新的集合类和 for..of 迭代循环。在本博文中,我们将介绍与 for..of 循环密切相关的生成器函数。

您可以参阅大量实用资料,了解使用生成器的原因和方法。简而言之,生成器是用于创建迭代器的特殊函数,而迭代器是具有 next() 方法的对象,可以调用该方法来获取值。在生成器函数中,关键字 yield 会为 next() 提供值。使用 yield挂起生成器函数的执行,并保留状态,直到再次调用 next() 为止。此时,代码会重新开始并继续执行,直到它 yield 另一个值(或生成器函数终止)为止。生成器函数有几个典型用例,例如使用它们迭代 Fibonacci 数列中的数字。

了解了基本知识后,我们来深入研究一个 JavaScript 示例,其中涵盖了使用生成器时的一些注意事项或“棘手问题”。代码中包含大量注释,您可以在阅读代码之前先试用实际版本

那么,我们从代码中可以得到哪些重要启示呢?

首先,构建生成器会产生具有自己独特状态的唯一迭代器,并且您可以向生成器构造函数传入可控制行为的参数。

其次,您可以在调用迭代器的 next() 方法时传入参数,该值将分配给上一个迭代器调用中 yield 语句左侧的任何内容。这是改变迭代器输出的绝佳方式。在这里,我们使用它来控制生成的字词是采用大写还是小写。如果您想影响生成的第一个值,请通过向生成器的构造函数传递参数来实现。

最后,生成器可以生成有限或无限的迭代器。如果您使用的是无限迭代器,请确保您有基于 yielded 值的某种终止条件,因为很容易无意中编写无限循环,尤其是在使用 for..of 进行迭代时。如果您通过调用 next() 来处理有限迭代器,则返回的对象的 .done 属性会指示迭代是否已完成。

我们希望此示例以及网络上提供的其他资源能让您感到兴奋,并思考如何在自己的代码中使用生成器。Firefox 31 及更高版本和 Chrome 39 及更高版本原生支持生成器。Regenerator 项目为其他浏览器提供生成器支持,您也可以使用 Traceur。

感谢 Erik Arvidsson 帮助审核本文。