ES6之函數(shù)擴(kuò)展

目錄
一惶看、 函數(shù)參數(shù)的默認(rèn)值
二、rest參數(shù)
三六孵、嚴(yán)格模式
四纬黎、name 屬性
五、箭頭函數(shù)
六劫窒、雙冒號運(yùn)算符(目前報錯本今,只是提案。)
七主巍、重點(diǎn): 尾調(diào)用優(yōu)化冠息,尾遞歸優(yōu)化( Fibonacci 數(shù)列)
八、函數(shù)參數(shù)尾逗號

尾遞歸
總結(jié)一下孕索,遞歸本質(zhì)上是一種循環(huán)操作逛艰。純粹的函數(shù)式編程語言沒有循環(huán)操作命令,所有的循環(huán)都用遞歸實(shí)現(xiàn)搞旭,這就是為什么尾遞歸對這些語言極其重要散怖。對于其他支持“尾調(diào)用優(yōu)化”的語言(比如 Lua,ES6)选脊,只需要知道循環(huán)可以用遞歸代替杭抠,而一旦使用遞歸,就最好使用尾遞歸恳啥。

下面是一個正常的遞歸函數(shù)偏灿。

function sum(x, y) {
  if (y > 0) {
    return sum(x + 1, y - 1);
  } else {
    return x;
  }
}

sum(1, 100000)
// Uncaught RangeError: Maximum call stack size exceeded(…)

上面代碼中,sum是一個遞歸函數(shù)钝的,參數(shù)x是需要累加的值翁垂,參數(shù)y控制遞歸次數(shù)铆遭。一旦指定sum遞歸 100000 次,就會報錯沿猜,提示超出調(diào)用棧的最大次數(shù)枚荣。

蹦床函數(shù)(trampoline)可以將遞歸執(zhí)行轉(zhuǎn)為循環(huán)執(zhí)行。

function trampoline(f) {
  while (f && f instanceof Function) {
    f = f();
  }
  return f;
}

上面就是蹦床函數(shù)的一個實(shí)現(xiàn)啼肩,它接受一個函數(shù)f作為參數(shù)橄妆。只要f執(zhí)行后返回一個函數(shù),就繼續(xù)執(zhí)行祈坠。注意害碾,這里是返回一個函數(shù),然后執(zhí)行該函數(shù)赦拘,而不是函數(shù)里面調(diào)用函數(shù)慌随,這樣就避免了遞歸執(zhí)行,從而就消除了調(diào)用棧過大的問題躺同。

然后阁猜,要做的就是將原來的遞歸函數(shù),改寫為每一步返回另一個函數(shù)蹋艺。

function sum(x, y) {
  if (y > 0) {
    return sum.bind(null, x + 1, y - 1);
  } else {
    return x;
  }
}

上面代碼中剃袍,sum函數(shù)的每次執(zhí)行,都會返回自身的另一個版本车海。

現(xiàn)在笛园,使用蹦床函數(shù)執(zhí)行sum,就不會發(fā)生調(diào)用棧溢出侍芝。

trampoline(sum(1, 100000))
// 100001

蹦床函數(shù)并不是真正的尾遞歸優(yōu)化研铆,下面的實(shí)現(xiàn)才是。

function tco(f) {
  var value;
  var active = false;
  var accumulated = [];

  return function accumulator() {
    accumulated.push(arguments);
    if (!active) {
      active = true;
      while (accumulated.length) {
        value = f.apply(this, accumulated.shift());
      }
      active = false;
      return value;
    }
  };
}

var sum = tco(function(x, y) {
  if (y > 0) {
    return sum(x + 1, y - 1)
  }
  else {
    return x
  }
});

sum(1, 100000)
// 100001

上面代碼中州叠,tco函數(shù)是尾遞歸優(yōu)化的實(shí)現(xiàn)棵红,它的奧妙就在于狀態(tài)變量active。默認(rèn)情況下咧栗,這個變量是不激活的逆甜。一旦進(jìn)入尾遞歸優(yōu)化的過程,這個變量就激活了致板。然后交煞,每一輪遞歸sum返回的都是undefined,所以就避免了遞歸執(zhí)行斟或;而accumulated數(shù)組存放每一輪sum執(zhí)行的參數(shù)素征,總是有值的,這就保證了accumulator函數(shù)內(nèi)部的while循環(huán)總是會執(zhí)行。這樣就很巧妙地將“遞歸”改成了“循環(huán)”御毅,而后一輪的參數(shù)會取代前一輪的參數(shù)根欧,保證了調(diào)用棧只有一層。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末端蛆,一起剝皮案震驚了整個濱河市凤粗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌今豆,老刑警劉巖嫌拣,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晚凿,居然都是意外死亡亭罪,警方通過查閱死者的電腦和手機(jī)瘦馍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門歼秽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人情组,你說我怎么就攤上這事燥筷。” “怎么了院崇?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵肆氓,是天一觀的道長。 經(jīng)常有香客問我底瓣,道長谢揪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任捐凭,我火速辦了婚禮拨扶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茁肠。我一直安慰自己患民,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布垦梆。 她就那樣靜靜地躺著匹颤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪托猩。 梳的紋絲不亂的頭發(fā)上印蓖,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音京腥,去河邊找鬼赦肃。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摆尝。 我是一名探鬼主播温艇,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堕汞!你這毒婦竟也來了勺爱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤讯检,失蹤者是張志新(化名)和其女友劉穎琐鲁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體人灼,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡围段,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了投放。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奈泪。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灸芳,靈堂內(nèi)的尸體忽然破棺而出涝桅,到底是詐尸還是另有隱情,我是刑警寧澤烙样,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布冯遂,位于F島的核電站,受9級特大地震影響谒获,放射性物質(zhì)發(fā)生泄漏蛤肌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一批狱、第九天 我趴在偏房一處隱蔽的房頂上張望裸准。 院中可真熱鬧,春花似錦精耐、人聲如沸狼速。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽向胡。三九已至,卻和暖如春惊完,著一層夾襖步出監(jiān)牢的瞬間僵芹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工小槐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拇派,地道東北人荷辕。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像件豌,于是被迫代替她去往敵國和親疮方。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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

  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前茧彤,不能直接為函數(shù)的參數(shù)指定默認(rèn)值骡显,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    陳老板_閱讀 447評論 0 1
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前曾掂,不能直接為函數(shù)的參數(shù)指定默認(rèn)值惫谤,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,363評論 0 1
  • 1.函數(shù)參數(shù)的默認(rèn)值 (1).基本用法 在ES6之前珠洗,不能直接為函數(shù)的參數(shù)指定默認(rèn)值溜歪,只能采用變通的方法。
    趙然228閱讀 684評論 0 0
  • 唐太宗貞觀元年许蓖,李績(唐朝初期名將蝴猪,與衛(wèi)國公李靖并稱。)心愛的女兒忽然去世了蛔糯,就葬在城北的郊外拯腮,他派了一個家僮在墳...
    千萬悅讀閱讀 702評論 0 50
  • 01. 不知道你有沒有這樣的體會? 好不容易和一群老同學(xué)聚在一塊蚁飒,突然有人喊了一句“打王者吧”,大家眼里立即發(fā)亮萝喘,...
    V8SUPERCHARGER閱讀 167評論 0 0