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 入門----阮一峰