一越妈、Generator 函數(shù)含義
在Javascript中籍嘹,一個(gè)函數(shù)一旦開始執(zhí)行,就會(huì)運(yùn)行到最后或遇到return時(shí)結(jié)束瑟俭,運(yùn)行期間不會(huì)有其它代碼能夠打斷它,也不能從外部再傳入值到函數(shù)體內(nèi)契邀。
而Generator函數(shù)(生成器)的出現(xiàn)使得打破函數(shù)的完整運(yùn)行成為了可能摆寄,其語法行為與傳統(tǒng)函數(shù)完全不同。
Generator函數(shù)是ES6提供的一種異步編程解決方案蹂安,形式上也是一個(gè)普通函數(shù),但有幾個(gè)顯著的特征:
1.function關(guān)鍵字與函數(shù)名之間有一個(gè)星號(hào) "*" (推薦緊挨著function關(guān)鍵字)锐帜。
2.函數(shù)體內(nèi)使用 yield 表達(dá)式田盈,定義不同的內(nèi)部狀態(tài) (可以有多個(gè)yield)。
3.直接調(diào)用 Generator函數(shù)并不會(huì)執(zhí)行缴阎,也不會(huì)返回運(yùn)行結(jié)果允瞧,而是返回一個(gè)遍歷器對(duì)象(Iterator Object)。
4.依次調(diào)用遍歷器對(duì)象的next方法蛮拔,遍歷 Generator函數(shù)內(nèi)部的每一個(gè)狀態(tài)述暂。
// 傳統(tǒng)函數(shù)
function foo() {
return 'hello world';
}
foo() // 'hello world',一旦調(diào)用立即執(zhí)行
// Generator函數(shù)
function* gen() {
yield 'status one'; // yield 表達(dá)式是暫停執(zhí)行的標(biāo)記
return 'hello world';
}
let iterator = gen() // 調(diào)用 Generator函數(shù)建炫,函數(shù)并沒有執(zhí)行畦韭,返回的是一個(gè)Iterator對(duì)象
iterator.next() // {value: "status one", done: false},value 表示返回值肛跌,done 表示遍歷還沒有結(jié)束
iterator.next() // {value: "hello world", done: true}艺配,value 表示返回值察郁,done 表示遍歷結(jié)束
上面的代碼中可以看到傳統(tǒng)函數(shù)和Generator函數(shù)的運(yùn)行是完全不同的,傳統(tǒng)函數(shù)調(diào)用后立即執(zhí)行并輸出了返回值转唉;Generator函數(shù)則沒有執(zhí)行而是返回一個(gè)Iterator對(duì)象皮钠,并通過調(diào)用Iterator對(duì)象的next方法來遍歷。
二赠法、yield 表達(dá)式
1)yield 表達(dá)式只能用在 Generator 函數(shù)里面麦轰,用在其它地方都會(huì)報(bào)錯(cuò)
2)yield 表達(dá)式如果用在另一個(gè)表達(dá)式中,必須放在圓括號(hào)里面
3)yield 表達(dá)式用作參數(shù)或放在賦值表達(dá)式的右邊砖织,可以不加括號(hào)
4)yield 表達(dá)式和return語句的區(qū)別
相同:
都能返回緊跟在語句后面的那個(gè)表達(dá)式的值款侵。
不同:
1.每次遇到 yield,函數(shù)就暫停執(zhí)行镶苞,下一次再?gòu)脑撐恢美^續(xù)向后執(zhí)行喳坠;而 return 語句不具備記憶位置的功能。
2.一個(gè)函數(shù)只能執(zhí)行一次 return 語句,而在 Generator 函數(shù)中可以有任意多個(gè) yield