es6基礎(chǔ)知識(shí)4(函數(shù)拓展)


title: es6基礎(chǔ)知識(shí)3(函數(shù)拓展)
tags:

  • 參數(shù)默認(rèn)值
  • 剩余參數(shù)
  • 箭頭函數(shù)

categories:

  • 前端

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

es6中關(guān)于函數(shù)的拓展主要有函數(shù)參數(shù)默認(rèn)值弄捕、rest剩余函數(shù)玄柏、箭頭函數(shù)。函數(shù)的拓展是es6中比較重要的一部分內(nèi)容编兄。

es6之前,如果要設(shè)定函數(shù)的參數(shù)的默認(rèn)值,需要通過(guò)編碼來(lái)實(shí)現(xiàn),也就是通過(guò)或符號(hào)||來(lái)實(shí)現(xiàn)漠其,例如var x = x || 100, 這樣就設(shè)置了x的默認(rèn)值為100。

function func1(x, y) {

    // 通過(guò)||符號(hào)設(shè)置函數(shù)參數(shù)默認(rèn)值竿音,x為100和屎,y為200
    var x = x || 100;
    var y = y || 200;

}

這種方法非常不直觀,有了es6之后春瞬,可以將函數(shù)參數(shù)的默認(rèn)值寫(xiě)在形參后面,更加方便:

function func2(x = 100, y = 200) {
    ...
}

只是需要注意的是柴信,這種寫(xiě)法最好將帶有默認(rèn)值的形參只能寫(xiě)在參數(shù)列表的最后面,也就是當(dāng)函數(shù)有多個(gè)參數(shù)宽气,而只有部分參數(shù)具有默認(rèn)值時(shí)随常,這些參數(shù)只能寫(xiě)在參數(shù)列表的最后面:

function func3(a, b, c = 100) {
    // 這里a,b沒(méi)有默認(rèn)值潜沦,而c有一個(gè)默認(rèn)值,所以把c寫(xiě)在最后面
}

這樣做的原因主要是避免調(diào)用函數(shù)時(shí)可能產(chǎn)生的錯(cuò)誤:

// 加入將帶有默認(rèn)參數(shù)的形參寫(xiě)在前面
function func4(c = 100, b, a) {

}

// 如果在調(diào)用函數(shù)的時(shí)候想使用c的默認(rèn)值绪氛,不在第一參數(shù)位傳參唆鸡,這樣寫(xiě)就會(huì)報(bào)錯(cuò)
func4( , 200, 100)// 報(bào)錯(cuò)

2. 剩余參數(shù)

假設(shè)有一種情況,我們想寫(xiě)一個(gè)求和函數(shù)來(lái)計(jì)算輸入的任意多個(gè)參數(shù)的和枣察,比如sum(0, 1, 2, 3) = 6, sum(0, 1, 2, 3, 4, 5) = 15争占。在es6之前,如果要實(shí)現(xiàn)這個(gè)功能序目,需要用到函數(shù)中的arguments對(duì)象臂痕。

function sum() {
    let args = arguments; // 這里利用arguments對(duì)象拿到函數(shù)的實(shí)參,因此函數(shù)的形參沒(méi)有意義猿涨,也就可以不用寫(xiě)

    let ret = 0;

    for (let i = 0; i < args.length; i++) {
        ret = ret + args[i];
    }
    return ret
}

console.log(sum(1, 2, 4, 4)); // 11

雖然利用arguments對(duì)象可以解決任意多個(gè)參數(shù)這種問(wèn)題握童,但畢竟顯得不太直觀,有了es6以后叛赚,這個(gè)問(wèn)題就簡(jiǎn)單多了澡绩,我們可以使用剩余參數(shù)很方便的來(lái)解決這個(gè)問(wèn)題。剩余參數(shù)的寫(xiě)法是在函數(shù)定義時(shí)在形參前面加上...符號(hào)红伦,仍然用剛才的那個(gè)例子來(lái)說(shuō)明:

function sumes6(...newNumber){
    let ret = 0;

    for(let i = 0; i < newNumber.length; i++) {
        ret = ret + newNumber[i];
    }
    return ret;
}
console.log(sumes6(1, 2, 4, 4)); // 11

剩余參數(shù)可以理解為把函數(shù)輸入的實(shí)參源源不斷的壓入到函數(shù)的形參newNumber中英古,需要指出的是淀衣,這里可以采用數(shù)組的方法來(lái)訪問(wèn)到每一個(gè)傳入的參數(shù)昙读,但是newNumber實(shí)際上是一個(gè)對(duì)象而不是一個(gè)數(shù)組。

3. 箭頭函數(shù)

箭頭函數(shù)是es6中新增的一種簡(jiǎn)單的函數(shù)表達(dá)式寫(xiě)法膨桥。

// 習(xí)慣的函數(shù)定義方式
function func1(x, y) {

}

// 箭頭函數(shù)寫(xiě)法
let func1 = (x, y) => {}

箭頭函數(shù)具有很多方便的特點(diǎn)蛮浑,第一個(gè)是當(dāng)箭頭函數(shù)的參數(shù)有且只有一個(gè)的時(shí)候,箭頭函數(shù)參數(shù)的()可以省略:

// 有這樣一個(gè)箭頭函數(shù)
let func1 = (x) => {
    return x + 1;
}

// 這個(gè)箭頭函數(shù)的參數(shù)只有一個(gè)所以可以省略參數(shù)可括號(hào)()
let func1 = x => {
    return x + 1;
}

// 注意省略括號(hào)的情況是箭頭函數(shù)的參數(shù)有且只有一個(gè)只嚣,所以當(dāng)函數(shù)沒(méi)有參數(shù)時(shí)沮稚,括號(hào)也不可以省略
let func2 = () => {
    return 100;
}

第二個(gè)特點(diǎn)就是如果箭頭函數(shù)的語(yǔ)句有且只有一條,那么{}也可以省略册舞,并且這條語(yǔ)句如果是返回語(yǔ)句return蕴掏,那么return也可以省略。

let func1 = (x) => {
    return x + 1;
}

// 上面這樣一個(gè)函數(shù)就可以簡(jiǎn)寫(xiě)為
let func1 = x => x + 1;// 這種情況下调鲸,語(yǔ)句執(zhí)行的結(jié)果就是返回值

需要注意的是盛杰,如果這唯一的一條語(yǔ)句返回的是一個(gè)字面量對(duì)象,那么箭頭函數(shù)的{}依然不可以省略

let func1 = () => {
    return {
        x: 100,
        y: 200
    }
}// 這種情況下函數(shù)體的括號(hào)是不可省略的藐石,也就是不可以書(shū)寫(xiě)成下面的形式

let func1 = () => {
    x: 100,
    y: 200
}//這樣的寫(xiě)法是錯(cuò)誤的

箭頭函數(shù)的另一個(gè)特點(diǎn)是即供,箭頭函數(shù)內(nèi)部的this在函數(shù)的創(chuàng)建期就完成了綁定。this的綁定就像js玄幻小說(shuō)于微,簡(jiǎn)直是讓人琢磨不透逗嫡,對(duì)于大部分的普通函數(shù)青自,他們的this在執(zhí)行期綁定,下面這樣一個(gè)栗子:

<!DOCTYPE html>
<html lang="en">
<head>
  <title>箭頭函數(shù)</title>
</head>
<body>
  <button>按鈕一</button>
  <button>按鈕二</button>

  <script>
    function changeColor () {
      this.style.color = 'red';// 在函數(shù)定義的時(shí)候并不知道this指向誰(shuí)

    }

    let btns = document.querySelectorAll('button')

    for(let i = 0; i < btns.length; i++) {
      btns[i].onclick = changeColor
    }
  </script>
</body>
</html>

上面這個(gè)例子中給兩個(gè)按鈕都綁定了同一個(gè)事件函數(shù)changeColor驱证,函數(shù)在創(chuàng)建的時(shí)候并沒(méi)有確定this指向誰(shuí)延窜,只有當(dāng)用戶點(diǎn)擊了按鈕,確定了點(diǎn)用changeColor的對(duì)象時(shí)抹锄,才能明確this的指向需曾,所以這樣一個(gè)粒子的效果就是用戶點(diǎn)擊那一個(gè)按鈕,那個(gè)按鈕就改變顏色祈远。

普通函數(shù)的this在執(zhí)行期確定

接下來(lái)利用箭頭函數(shù)重寫(xiě)上面的那個(gè)粒子:

<!DOCTYPE html>
<html lang="en">
<head>
  <title>箭頭函數(shù)</title>
</head>
<body>
  <button>按鈕一</button>
  <button>按鈕二</button>

  <script>
    // function changeColor () {
    //   this.style.color = 'red';
    // }
    let changeColor = () => {
      this.style.color = 'red'
    }
    
    let btns = document.querySelectorAll('button')

    for(let i = 0; i < btns.length; i++) {
      btns[i].onclick = changeColor
    }
  </script>
</body>
</html>

然后在瀏覽器中執(zhí)行呆万,發(fā)現(xiàn)這一次并沒(méi)有實(shí)現(xiàn)點(diǎn)擊按鈕,按鈕改變顏色的功能车份,并且函數(shù)還爆出了錯(cuò)誤箭頭函數(shù).html:16 Uncaught TypeError: Cannot set property 'color' of undefinedat HTMLButtonElement.changeColor谋减,這個(gè)時(shí)候在控制臺(tái)中打印出this發(fā)現(xiàn)此時(shí)this指向的是window對(duì)象。

箭頭函數(shù)的this在函數(shù)定義的時(shí)候就已經(jīng)確定了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扫沼,一起剝皮案震驚了整個(gè)濱河市出爹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缎除,老刑警劉巖严就,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異器罐,居然都是意外死亡梢为,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)轰坊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铸董,“玉大人,你說(shuō)我怎么就攤上這事肴沫∷诤Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵颤芬,是天一觀的道長(zhǎng)悲幅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)站蝠,這世上最難降的妖魔是什么汰具? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮沉衣,結(jié)果婚禮上郁副,老公的妹妹穿的比我還像新娘。我一直安慰自己豌习,他們只是感情好存谎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布拔疚。 她就那樣靜靜地躺著,像睡著了一般既荚。 火紅的嫁衣襯著肌膚如雪稚失。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天恰聘,我揣著相機(jī)與錄音句各,去河邊找鬼。 笑死晴叨,一個(gè)胖子當(dāng)著我的面吹牛凿宾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兼蕊,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼初厚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了孙技?” 一聲冷哼從身側(cè)響起产禾,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牵啦,沒(méi)想到半個(gè)月后亚情,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哈雏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年楞件,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僧著。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡履因,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盹愚,到底是詐尸還是另有隱情,我是刑警寧澤站故,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布皆怕,位于F島的核電站,受9級(jí)特大地震影響西篓,放射性物質(zhì)發(fā)生泄漏愈腾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一岂津、第九天 我趴在偏房一處隱蔽的房頂上張望虱黄。 院中可真熱鬧,春花似錦吮成、人聲如沸橱乱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泳叠。三九已至作瞄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間危纫,已是汗流浹背宗挥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留种蝶,地道東北人契耿。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像螃征,于是被迫代替她去往敵國(guó)和親宵喂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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