發電機 - 神秘片段

波斯尼克 (Jeff Posnick)
Jeff Posnick

ECMAScript 6 草稿規格》已為現代 JavaScript 開發人員帶來許多喜悅。在上一篇文章中,我們已說明一些新的集合類別和 for..of 疊代迴圈。在本文章中,我們將探討如何與 for..of 迴圈密切整合:產生器函式。

目前已有多位精彩材料介紹了發電機的原理和使用方法。簡單來說,產生器是建立疊代器的特殊函式,疊代器是物件,具有 next() 方法,您可以呼叫此方法來取得值。在產生器函式中,關鍵字 yield 提供 next() 的值。使用 yield「暫停」產生產生器函式,並保留狀態,直到再次呼叫 next() 為止,此時程式碼會開始備份並繼續,直到 yield 另一個值 (或產生器函式終止) 為止。產生器函式有許多標準用途,例如使用這些案例疊代 Fibonacci 序列中的數字。

簡單說明基本概念後,接下來我們要深入探討 JavaScript 範例,其中涵蓋一些與產生器合作的缺點 (即「語音位元」)。這裡有許多註解,您可以先試用上線版本的程式碼,再閱讀內容:

那麼程式碼有哪些重要要點呢?

首先,建構產生器會產生不重複的疊代器和專屬狀態,您可以將參數傳入可控制行為的產生器建構函式。

其次,您可以在呼叫疊代器的 next() 方法時傳入參數,系統會將該值指派給前一個疊代器叫用的 yield 陳述式左側中的任何內容。這是變更疊代器輸出結果的好方法,在這個中,我們用於控制產生的字詞是否為大寫。如果要影響產生的第一個值,請使用產生器建構函式的參數。

最後,產生器可產生有限或無限疊代器。如果您使用的是無限疊代器,請務必根據 yield 的值採用某些終端機條件,這很容易不小心寫入無限迴圈,特別是在使用 for..of 進行疊代時。如果您是透過呼叫 next() 使用有限疊代器,則此物件的 .done 屬性會指示疊代是否完成。

我們希望這個範例以及網路上的其他資源能夠帶給您一些刺激感,並且讓您思考如何在自己的程式碼中使用產生器。Firefox 31 以上版本和 Chrome 版本 (自 39 以上版本內建支援產生器)。重新產生器專案可支援其他瀏覽器,也可以使用 Traceur。

感謝 Erik Arvidsson 協助他參閱這篇文章。