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 協助撰寫這篇文章。