天天看點

ECMAScript 6 學習筆記----Generator函數

1.簡介

Generator函數是ES6提供的一種異步程式設計解決方案,文法行為與傳統函數完全不同。

Generator函數有多種了解角度。從文法上,首先可以把它了解成,Generator函數是一個狀态機,封裝了多個内部狀态。

執行Generator函數會傳回一個周遊器對象,也就是說,Generator函數除了狀态機,還是一個周遊器對象生成函數。傳回的周遊器對象,可以依次周遊Generator函數内部的每一個狀态。

形式上,Generator函數是一個普通函數,但是有兩個特征。一是,

function

關鍵字與函數名之間有一個星号;二是,函數體内部使用

yield

語句,定義不同的内部狀态(yield語句在英語裡的意思就是“産出”)。

function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}

var hw = helloWorldGenerator();                

上面代碼定義了一個Generator函數

helloWorldGenerator

,它内部有兩個

yield

語句“hello”和“world”,即該函數有三個狀态:hello,world和return語句(結束執行)。

然後,Generator函數的調用方法與普通函數一樣,也是在函數名後面加上一對圓括号。不同的是,調用Generator函數後,該函數并不執行,傳回的也不是函數運作結果,而是一個指向内部狀态的指針對象,也就是上一章介紹的周遊器對象(Iterator Object)。

下一步,必須調用周遊器對象的next方法,使得指針移向下一個狀态。也就是說,每次調用

next

方法,内部指針就從函數頭部或上一次停下來的地方開始執行,直到遇到下一個

yield

語句(或

return

語句)為止。換言之,Generator函數是分段執行的,

yield

語句是暫停執行的标記,而

next

方法可以恢複執行。

學習文檔:ECMAScript 入門----阮一峰

繼續閱讀