ECMAScript 6 草稿規格已為現代 JavaScript 開發人員帶來許多樂趣。我們在上一篇文章中介紹了一些新的集合類別和 for..of
迴圈。在本篇文章中,我們將討論與 for..of
迴圈密切相關的內容:產生器函式。
網路上有許多優質資源,可以讓您瞭解為何要使用產生器,以及如何使用產生器。簡而言之,產生器是用來建立疊代器的特殊函式,而疊代器是具有 next()
方法的物件,可用來取得值。在產生器函式中,關鍵字 yield
會提供 next()
的值。使用 yield
會暫停執行產生器函式,並保留狀態,直到再次呼叫 next()
為止。此時程式碼會重新開始並繼續執行,直到 yield
另一個值 (或產生器函式終止) 為止。產生器函式有幾個標準用途,例如用於迭代 費氏數列中的數字。
基礎知識講完後,我們就來深入瞭解 JavaScript 範例,其中涵蓋使用產生器時的部分陷阱或「棘手部分」。程式碼中包含大量註解,您可以先試用程式的實際版本,再仔細閱讀程式碼:
那麼,這段程式碼有哪些重點?
首先,建構產生器會產生獨特的迭代器,並具有其自身的狀態,您可以將參數傳遞至可控制行為的產生器建構函式。
其次,您可以在呼叫疊代器的 next()
方法時傳入參數,該值會指派給上一個疊代器呼叫中 yield
陳述式左側的任何值。這是變更迭代器輸出的絕佳方法,我們會用它來控制產生的字詞是否為大寫。如要影響產生的首個值,請透過產生器建構函式的參數進行。
最後,產生器可以產生有限或無限的疊代器。如果您使用無限疊代器,請務必根據 yield
ed 的值,設定某種終端條件。因為很容易不小心寫出無限迴圈,尤其是在使用 for..of
進行疊代時。如果您透過呼叫 next()
使用有限疊代器,則傳回物件的 .done
屬性會指出疊代是否已完成。
我們希望這份範例和網路上的其他資源,能讓您對產生器產生興趣,並思考如何在自己的程式碼中使用產生器。Firefox 31 以上版本和 Chrome 39 以上版本原生支援產生器。Regenerator 專案為其他瀏覽器提供產生器支援,您也可以使用 Traceur。
感謝 Erik Arvidsson 協助審查本文。