? ? ? Generator函數,ES6新增的函數,通過這個函數可以控制函數的執行步驟,也有說這是一個狀態機,內部封裝多個狀態。執行Generator函數,不會立即這個函數方法,會返回一個遍歷對象,可以依次遍歷到函數中的每個狀態或者說是每個特意要執行的步驟,至于這個返回的對象呢是指向函數內部表達式運行的開始,通過每次調用next依次執行到里面每步特別標注的步驟--yield注明或者return,而每次調用next方法返回的對象包含value(內部狀態的值,yield后面的那個值)done(表示是否遍歷結束或者說是里面的特別的步驟是否運行結束)。
? ? ? Generator函數具體的表現形式:function 和函數名之間有個*,函數體內部的表達式包含 yield去定義一個特別表明的步驟(狀態)。對于*的位置沒有特別要求在function和函數名之間都行;yield放入別的函數表達式中必須加括號,但是作為參數聲明或者變量賦值就不需要,next運行時碰到yield就會停止后續步驟執行,并返回yield后面那個表達式作為value,再次調用next接著執行直到遇到yield,如果遇不到yield的話 return也行,并將return后面的表達式作為value值,如果啥都遇不上就返回value是個undefined。generator函數的簡寫形式就是在函數名前加個*號,* fun
? ? ?Generator函數的方法:next,依次運行到每個特殊注明的步驟,可攜帶一個參數表示上一個yield表達式返回的值(因此第一次next不用跟參數值從第二個next開始),通過這些個參數可以不同步驟階段的不同的值進行不同的運算;for...of..遍歷generator函數中的yield表達式。Generator函數返回的對象都包含一個throw方法拋出然后在Generator函數中catch的錯誤,如果函數內部沒有catch而外部有就外部catch,如果都沒有函數就報錯,并且自帶的throw方法之后自動執行一次next,但是如果在外部捕獲的錯誤,那么generator函數就會停止執行。Generator函數的return方法(某個參數)結束函數執行并返回某個值或者undefined,如果存在try...finally..那么等finally 執行完再執行return。其中next、throw、return都可以使generator函數接著執行,不同在于next是正常執行,throw是拋出錯誤往下執行,return是終止程序。
? ? ? ?在一個generator函數中調用另一個generetor函數沒有作用,但是被調用的generator函數前面加上yield *那就可以正常執行了,但是使用yield的話返回的Generator函數返回的對象。 yield * 后面跟一個數組對象那么它將開始對數組對象的遍歷,如果是yield 后面跟數組對象呢那就是返回數組對象。?
? ? Generator函數不能用作構造函數,因為它返回的總是一個遍歷器對象,也不能跟new命令一起使用會報錯。但是可以根據call改變函數內部的this指向生成對象實例或者直接使用Prototype。
? ? ? 狀態機是能夠根據控制信號按照預先設置狀態進行位移,是協調相關信號動作、完成特定操作的控制中心。而generator函數的運行狀態比較適合實現狀態機的結構。Generator函數用途:異步操作的同步化表達(根據next方法),控制流管理,部署Iterator接口,作為數據結構。