生成器是ES6中新增的一個極爲靈活的結構,擁有在一個函數塊內暫停和恢復代碼執行的能力。
1.生成器基礎
生成器的形式是一個函數,函數名稱前帶星號(*)表示他是一個生成器。只要是能夠定義函數的地方,就能夠定義生成器(箭頭函數不能用來定義生成器)函數
function *generatorFn(){} //生成器函數聲明
調用生成器函數會產生一個生成器對象。生成器對象一開始處於暫停執行狀態(suspended)。與迭代器類似,生成器對象也實現了Iterator接口,所以具備next()方法。調用這個方法會讓生成器開始或恢復執行
next()方法的返回值相似於迭代器,有一個done屬性和一個value屬性。函數體爲空的生成器函數中間不會停留,調用一次next()就會讓生成器到達 done:true 狀態code
function *generatorFn(){} const g = generatorFn(); console.log( g ); //generatorFn{ <suspended> } console.log( g.next ); //f next() { [native code] } console.log( g.next() ); //{ done:true, value:undefined }
value屬性是生成器函數的返回值,默認爲undefined,能夠經過生成器函數的返回值指定:對象
function *generatorFn(){ return 'foo'; } ...... console.log( g.next() ) //{ done:true, value:'foo' }
生成器函數只會在初次調用next()方法後開始執行接口
生產器對象實現了Iterator接口,他們默認的迭代器是自引用的generator
function *generatorFn() {} console.log( generatorFn ); //f* generatorFn() {} console.log( generatorFn()[Symbol.iterator] );//f [Symbol.iterator]() {native code} console.log( generatorFn() ); //generatorFn{ <suspended> } console.log( generatorFn()[Symbol.iterator] ); //generatorFn{ <suspended> }
2.經過yield中斷執行it