發電機 - 神秘片段

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

想要瞭解使用產生器的原因和方法,可以參閱這份指南,並利用大量實用資源瞭解相關做法。簡單來說,產生器是建立疊代器的特殊函式,而疊代器是具有 next() 方法的物件,可以呼叫該方法以取得值。在產生器函式中,關鍵字 yield 提供 next() 的值。使用 yield 會「暫停」產生器函式的執行作業,系統會保留狀態,直到再次呼叫 next() 為止,屆時程式碼會開始重啟並繼續,直到 yield 另一個值 (或直到產生器函式終止) 為止。產生器功能有幾個標準化用途,例如使用這些函式疊代費波那契序列中的數字。

完成基本概念後,接下來我們要深入介紹 JavaScript 範例,其中涵蓋產生器的一些問題,也就是所謂的「驚人的位元」。這裡的註解內容有很多,您可以先試用看看實際版本的程式碼,再開始閱讀:

這個程式碼有哪些要點呢?

首先,建構產生器會導致一個獨特的疊代器,且該疊代器本身俱有獨特的狀態,您可以將參數傳入可控制行為的產生器建構函式。

第二,您可以在呼叫疊代器的 next() 方法時傳入參數,該值將指派給前一個疊代器叫用中 yield 陳述式左側的任何內容。這是變更疊代器輸出結果的絕佳方式,我們使用此方法來控制所產生字詞的大小寫是否為大寫。如要影響第一個產生的值,請透過產生器建構函式的參數進行設定。

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

我們希望這個範例和其他網路資源都為您帶來一些興奮之情,並讓您思考如何在自己的程式碼中使用產生器。Firefox 版本從 31 開始,Chrome 自內建 39 種支援產生器,Regenerator 專案可為其他瀏覽器提供產生器,也可選擇使用 Traceur。

感謝 Erik Arvidsson 協助撰寫這篇文章。