發電機 - 神秘片段

ECMAScript 6 草稿規格已為現代 JavaScript 開發人員帶來許多樂趣。我們在上一篇文章中介紹了一些新的集合類別和 for..of 迴圈。在本篇文章中,我們將討論與 for..of 迴圈密切相關的內容:產生器函式。

網路上有許多優質資源,可以讓您瞭解為何要使用產生器,以及如何使用產生器。簡而言之,產生器是用來建立疊代器的特殊函式,而疊代器是具有 next() 方法的物件,可用來取得值。在產生器函式中,關鍵字 yield 會提供 next() 的值。使用 yield暫停執行產生器函式,並保留狀態,直到再次呼叫 next() 為止。此時程式碼會重新開始並繼續執行,直到 yield 另一個值 (或產生器函式終止) 為止。產生器函式有幾個標準用途,例如用於迭代 費氏數列中的數字。

基礎知識講完後,我們就來深入瞭解 JavaScript 範例,其中涵蓋使用產生器時的部分陷阱或「棘手部分」。程式碼中包含大量註解,您可以先試用程式的實際版本,再仔細閱讀程式碼:

那麼,這段程式碼有哪些重點?

首先,建構產生器會產生獨特的迭代器,並具有其自身的狀態,您可以將參數傳遞至可控制行為的產生器建構函式。

其次,您可以在呼叫疊代器的 next() 方法時傳入參數,該值會指派給上一個疊代器呼叫中 yield 陳述式左側的任何值。這是變更迭代器輸出的絕佳方法,我們會用它來控制產生的字詞是否為大寫。如要影響產生的首個值,請透過產生器建構函式的參數進行。

最後,產生器可以產生有限或無限的疊代器。如果您使用無限疊代器,請務必根據 yielded 的值,設定某種終端條件。因為很容易不小心寫出無限迴圈,尤其是在使用 for..of 進行疊代時。如果您透過呼叫 next() 使用有限疊代器,則傳回物件的 .done 屬性會指出疊代是否已完成。

我們希望這份範例和網路上的其他資源,能讓您對產生器產生興趣,並思考如何在自己的程式碼中使用產生器。Firefox 31 以上版本和 Chrome 39 以上版本原生支援產生器。Regenerator 專案為其他瀏覽器提供產生器支援,您也可以使用 Traceur。

感謝 Erik Arvidsson 協助審查本文。