generator

用函數(shù)編寫一個產(chǎn)生斐波那契數(shù)列的函數(shù)申窘,可以這么寫:

function fib(max) {
    var
        t,
        a = 0,
        b = 1,
        arr = [0, 1];
    while (arr.length < max) {
        t = a + b;
        a = b;
        b = t;
        arr.push(t);
    }
    return arr;
}

fib(5); // [0, 1, 1, 2, 3]
fib(10); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

函數(shù)只能返回一次砸泛,所以必須返回一個 Array十籍。但是,如果換成 generator唇礁,就可以一次返回一個數(shù)勾栗,不斷返回多次。用 generator 改寫如下:

function* fib(max) {
    var
        t,
        a = 0,
        b = 1,
        n = 1;
    while (n < max) {
        yield a;
        t = a + b;
        a = b;
        b = t;
        n ++;
    }
    return a;
}

直接調(diào)用試試:

fib(5); // fib {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window}

直接調(diào)用一個 generator 和調(diào)用函數(shù)不一樣盏筐,fib(5) 僅僅是創(chuàng)建了一個 generator 對象围俘,還沒有去執(zhí)行它。

調(diào)用 generator 對象有兩個方法,一是不斷地調(diào)用 generator 對象的 next() 方法:

var f = fib(5);
f.next(); // {value: 0, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 2, done: false}
f.next(); // {value: 3, done: true}

next() 方法會執(zhí)行 generator 的代碼界牡,然后簿寂,每次遇到 yield x; 就返回一個對象 {value: x, done: true/false},然后“暫退尥觯”常遂。返回的 value 就是 yield 的返回值。

done 表示這個 generator 是否已經(jīng)執(zhí)行結(jié)束了挽荠。如果 donetrue烈钞,則 value 就是 return 的返回值。

當執(zhí)行到 donetrue 時坤按,這個 generator 對象就已經(jīng)全部執(zhí)行完畢毯欣,不要再繼續(xù)調(diào)用 next() 了。

第二個方法是直接用 for ... of 循環(huán)迭代 generator 對象臭脓,這種方式不需要我們自己判斷 done

for (var x of fib(5)) {
    console.log(x); // 依次輸出0, 1, 1, 2, 3
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酗钞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子来累,更是在濱河造成了極大的恐慌砚作,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘹锁,死亡現(xiàn)場離奇詭異葫录,居然都是意外死亡,警方通過查閱死者的電腦和手機领猾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門米同,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摔竿,你說我怎么就攤上這事面粮。” “怎么了继低?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵熬苍,是天一觀的道長。 經(jīng)常有香客問我袁翁,道長柴底,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任粱胜,我火速辦了婚禮柄驻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好划鸽,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著答憔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掀抹。 梳的紋絲不亂的頭發(fā)上虐拓,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機與錄音傲武,去河邊找鬼蓉驹。 笑死,一個胖子當著我的面吹牛揪利,可吹牛的內(nèi)容都是我干的态兴。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼疟位,長吁一口氣:“原來是場噩夢啊……” “哼瞻润!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甜刻,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤绍撞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后得院,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傻铣,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年祥绞,在試婚紗的時候發(fā)現(xiàn)自己被綠了非洲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜕径,死狀恐怖怪蔑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丧荐,我是刑警寧澤缆瓣,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站虹统,受9級特大地震影響弓坞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜车荔,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一渡冻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忧便,春花似錦族吻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砍艾。三九已至,卻和暖如春巍举,著一層夾襖步出監(jiān)牢的瞬間脆荷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工懊悯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜓谋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓炭分,卻偏偏與公主長得像桃焕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捧毛,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 簡介 基本概念 Generator函數(shù)是ES6提供的一種異步編程解決方案覆旭,語法行為與傳統(tǒng)函數(shù)完全不同。本章詳細介紹...
    呼呼哥閱讀 1,070評論 0 4
  • 在此處先列下本篇文章的主要內(nèi)容 簡介 next方法的參數(shù) for...of循環(huán) Generator.prototy...
    醉生夢死閱讀 1,439評論 3 8
  • 本文作者就是我岖妄,簡書的microkof型将。如果您覺得本文對您的工作有意義,產(chǎn)生了不可估量的價值荐虐,那么請您不吝打賞我七兜,...
    microkof閱讀 23,724評論 16 78
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券福扬,享受所有官網(wǎng)優(yōu)惠腕铸,并抽取幸運大...
    HetfieldJoe閱讀 6,374評論 9 19
  • 如果在走3小時 還未遇上向左轉(zhuǎn)的路標 我想我可能是迷了路 迷路在這金秋的十月 留戀在這紛紛的落葉 我想把每一個足跡...
    江城妖怪閱讀 269評論 2 1