6.函數(shù)的擴(kuò)展

回到目錄

函數(shù)參數(shù)的默認(rèn)值

function add(x = 12, y = 10) {
  return x + y;
}

用 es5 來(lái)模擬

function add(x, y) {
  if (!x && typeof x === "undefined") {
    x = 12;
  }
  if (!y && typeof y === "undefined") {
    y = 10;
  }
  return x + y;
}

let x = 99;
function foo(p = x + 1) {
  console.log(p);
}

foo(); // 100

x = 100;
foo(); // 101

與解構(gòu)賦值默認(rèn)值結(jié)合使用

function foo({ x, y = 5 }) {
  console.log(x, y);
}

// 等同于
function foo(obj) {
  let { x, y = 5 } = obj;
  console.log(x, y);
}

從等同代碼可以看出捺弦,在做解構(gòu)之前并沒(méi)有判斷 obj 的數(shù)據(jù)類型,所以如果 obj 不能進(jìn)行對(duì)象的解構(gòu)時(shí)就會(huì)報(bào)錯(cuò)属愤;
為了避免這種問(wèn)題贝搁,我們就可以給 obj 再來(lái)一個(gè)默認(rèn)值

function foo(foo = {}) {
  let { x, y = 5 } = obj;
  console.log(x, y);
}
// 上述代碼簡(jiǎn)化一下
function foo({ x, y = 5 } = {}) {
  console.log(x, y);
}

一般的毅糟,我們把可省略的參數(shù)放在最后面

函數(shù)的 length (該函數(shù)預(yù)期必須傳入的參數(shù)個(gè)數(shù))

(這個(gè)屬性好像沒(méi)怎么用到過(guò))

指定了默認(rèn)值以后柠并,函數(shù)的 length 屬性耐床,將返回沒(méi)有指定默認(rèn)值的參數(shù)個(gè)數(shù)密幔。

如果設(shè)置了默認(rèn)值的參數(shù)不是尾參數(shù),那么 length 屬性也不再計(jì)入后面的參數(shù)了

(function(a) {}.length); // 1
(function(a = 5) {}.length); // 0
(function(a, b, c = 5) {}.length); // 2

應(yīng)用例子

利用參數(shù)默認(rèn)值撩轰,可以指定某一個(gè)參數(shù)不得省略胯甩,如果省略就拋出一個(gè)錯(cuò)誤。

function throwIfMissing() {
  throw new Error("Missing parameter");
}

function foo(mustBeProvided = throwIfMissing()) {
  return mustBeProvided;
}

foo();
// Error: Missing parameter

rest 參數(shù)

ES6 引入 rest 參數(shù)(形式為...變量名)钧敞,用于獲取函數(shù)的多余參數(shù)蜡豹,這樣就不需要使用 arguments 對(duì)象了麸粮。rest 參數(shù)搭配的變量是一個(gè)數(shù)組溉苛,該變量將多余的參數(shù)放入數(shù)組中。

function add(...values) {
  let sum = 0;

  for (var val of values) {
    sum += val;
  }

  return sum;
}

add(2, 5, 3); // 10

// 搭配展開(kāi)符食用弄诲,效果更好
let arr = [2, 5, 3, 4];
add(...arr); // 14

嚴(yán)格模式

ES2016 做了一點(diǎn)修改愚战,規(guī)定只要函數(shù)參數(shù)使用了默認(rèn)值、解構(gòu)賦值齐遵、或者擴(kuò)展運(yùn)算符寂玲,那么函數(shù)內(nèi)部就不能顯式設(shè)定為嚴(yán)格模式,否則會(huì)報(bào)錯(cuò)梗摇。

箭頭函數(shù)

var f = v => v;

// 等同于
var f = function(v) {
  return v;
};

箭頭函數(shù)的特點(diǎn)

  1. 函數(shù)體內(nèi)的 this 對(duì)象拓哟,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象伶授。

  2. 不可以當(dāng)作構(gòu)造函數(shù)断序,也就是說(shuō),不可以使用 new 命令糜烹,否則會(huì)拋出一個(gè)錯(cuò)誤违诗。

  3. 不可以使用 arguments 對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在疮蹦。如果要用诸迟,可以用 rest 參數(shù)代替。

  4. 不可以使用 yield 命令愕乎,因此箭頭函數(shù)不能用作 Generator 函數(shù)阵苇。

箭頭函數(shù)的優(yōu)點(diǎn)

  1. 極大的簡(jiǎn)化代碼
function sum(x) {
  return function(y) {
    return function(z) {
      return x + y + z;
    };
  };
}
sum(1)(2)(3) // 6

// 等效于
let sum = x=>y=>z=> x+y+z
sum(1)(2)(3) // 6

尾調(diào)用 和 尾遞歸

這是一種代碼優(yōu)化思想,形式上就是盡可能讓函數(shù)體內(nèi)的函數(shù)調(diào)用放在最后一步感论,可以降低調(diào)用的復(fù)雜度
尾調(diào)用詳情
回到目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慎玖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笛粘,更是在濱河造成了極大的恐慌趁怔,老刑警劉巖湿硝,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異润努,居然都是意外死亡关斜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門铺浇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痢畜,“玉大人,你說(shuō)我怎么就攤上這事鳍侣《∠。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵倚聚,是天一觀的道長(zhǎng)线衫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)惑折,這世上最難降的妖魔是什么授账? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮惨驶,結(jié)果婚禮上白热,老公的妹妹穿的比我還像新娘。我一直安慰自己粗卜,他們只是感情好屋确,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著续扔,像睡著了一般攻臀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上测砂,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天茵烈,我揣著相機(jī)與錄音,去河邊找鬼砌些。 笑死呜投,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的存璃。 我是一名探鬼主播仑荐,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纵东!你這毒婦竟也來(lái)了粘招?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偎球,失蹤者是張志新(化名)和其女友劉穎洒扎,沒(méi)想到半個(gè)月后辑甜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袍冷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年磷醋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胡诗。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邓线,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出煌恢,到底是詐尸還是另有隱情骇陈,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布瑰抵,位于F島的核電站你雌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谍憔。R本人自食惡果不足惜匪蝙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一主籍、第九天 我趴在偏房一處隱蔽的房頂上張望习贫。 院中可真熱鬧,春花似錦千元、人聲如沸苫昌。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祟身。三九已至,卻和暖如春物独,著一層夾襖步出監(jiān)牢的瞬間袜硫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工挡篓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婉陷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓官研,卻偏偏與公主長(zhǎng)得像秽澳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戏羽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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