Generator函數(shù)用法

一越妈、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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畦徘,一起剝皮案震驚了整個(gè)濱河市雏赦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晾浴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牍白,死亡現(xiàn)場(chǎng)離奇詭異脊凰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茂腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門狸涌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人最岗,你說我怎么就攤上這事帕胆。” “怎么了般渡?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵懒豹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我驯用,道長(zhǎng)脸秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任蝴乔,我火速辦了婚禮记餐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薇正。我一直安慰自己剥扣,他們只是感情好巩剖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钠怯,像睡著了一般佳魔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晦炊,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天鞠鲜,我揣著相機(jī)與錄音,去河邊找鬼断国。 笑死贤姆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稳衬。 我是一名探鬼主播霞捡,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼薄疚!你這毒婦竟也來了碧信?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤街夭,失蹤者是張志新(化名)和其女友劉穎砰碴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體板丽,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呈枉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埃碱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猖辫。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砚殿,靈堂內(nèi)的尸體忽然破棺而出啃憎,到底是詐尸還是另有隱情,我是刑警寧澤瓮具,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布荧飞,位于F島的核電站凡人,受9級(jí)特大地震影響名党,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挠轴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一传睹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岸晦,春花似錦欧啤、人聲如沸睛藻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽店印。三九已至,卻和暖如春倒慧,著一層夾襖步出監(jiān)牢的瞬間按摘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工纫谅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炫贤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓付秕,卻偏偏與公主長(zhǎng)得像兰珍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子询吴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348