ES6箭頭函數(shù)全解析|從入門到精通,一篇搞定!

?? 今天我們來聊聊JavaScript里那個(gè)讓代碼瞬間變“高級(jí)”的魔法——ES6箭頭函數(shù)!??

是不是覺得 function 寫起來太啰嗦?是不是被 this 指向搞得暈頭轉(zhuǎn)向??? 別慌,這篇筆記手把手帶你吃透箭頭函數(shù),不僅教你怎么寫,還告訴你為什么這么寫,干貨滿滿,建議先收藏再看!??


?? 什么是箭頭函數(shù)?

簡單來說,箭頭函數(shù)就是寫函數(shù)的一種新姿勢(shì)。它用 => 這個(gè)像箭頭一樣的符號(hào)來定義,不僅代碼量少了,讀起來也更清晰。

對(duì)比一下:

// 以前的老寫法(傳統(tǒng)函數(shù))
const add = function(a, b) {
  return a + b;
}

// 現(xiàn)在的潮寫法(箭頭函數(shù))
const add = (a, b) => a + b;

是不是瞬間清爽了???


?? 語法大變身(新手必看)

箭頭函數(shù)的語法非常靈活,我們分情況來看:

1. 基本款
參數(shù)和返回值都有,中規(guī)中矩。

const sum = (a, b) => {
  return a + b;
}

2. 極簡款(單參數(shù) & 單行返回)

  • 如果只有一個(gè)參數(shù),括號(hào) () 可以省略!
  • 如果只有一行代碼(且是返回值),大括號(hào) {}return 都可以省略!
// 只有一個(gè)參數(shù) x
const square = x => x * x; 

// 多個(gè)參數(shù),直接返回結(jié)果
const multiply = (a, b) => a * b;

3. 空參數(shù)
沒有參數(shù)時(shí),括號(hào)不能少。

const sayHi = () => console.log('Hello!');

4. 返回對(duì)象(避坑指南??)
如果你想直接返回一個(gè)對(duì)象,必須給對(duì)象加個(gè)括號(hào) (),不然JS會(huì)以為那是函數(shù)體!

// ? 錯(cuò)誤寫法
const getUser = () => { name: 'Tom', age: 18 }; // 返回 undefined

// ? 正確寫法
const getUser = () => ({ name: 'Tom', age: 18 }); 

?? 核心大招:this 指向(重點(diǎn)!)

這是箭頭函數(shù)最牛的地方,也是面試高頻考點(diǎn)!??

傳統(tǒng)函數(shù)this 像個(gè)“墻頭草”,誰調(diào)用它,它就指向誰。
箭頭函數(shù)this 是個(gè)“專一的人”,它在定義的時(shí)候就確定了,永遠(yuǎn)指向定義時(shí)外層作用域的 this。

舉個(gè)栗子??:

const obj = {
  name: '小紅書',
  // 傳統(tǒng)函數(shù)
  sayHi1: function() {
    setTimeout(function() {
      console.log(this.name); // ? 輸出 undefined (this指向window)
    }, 1000);
  },
  // 箭頭函數(shù)
  sayHi2: function() {
    setTimeout(() => {
      console.log(this.name); // ? 輸出 '小紅書' (this繼承自sayHi2)
    }, 1000);
  }
};

結(jié)論: 在回調(diào)函數(shù)(比如定時(shí)器、Promise)里,用箭頭函數(shù)可以完美解決 this 丟失的問題,再也不用寫 var that = this 了!??


?? 三大“不支持”(進(jìn)階知識(shí))

雖然箭頭函數(shù)好用,但它不是萬能的。以下情況千萬別用箭頭函數(shù):

  • 不能當(dāng)構(gòu)造函數(shù)
    你不能對(duì)它用 new 關(guān)鍵字。因?yàn)樗鼪]有自己的 this,也沒有 prototype 屬性。
    const Foo = () => {}; new Foo(); // 報(bào)錯(cuò)!

  • 沒有 arguments 對(duì)象
    在箭頭函數(shù)里訪問 arguments,它其實(shí)是外層函數(shù)的參數(shù)。如果你想獲取所有參數(shù),請(qǐng)用 剩余參數(shù) (...args)
    const sum = (...args) => args.reduce((a, b) => a + b, 0);

  • 不能用作 Generator 函數(shù)
    箭頭函數(shù)里不能用 yield 關(guān)鍵字。


?? 什么時(shí)候用它?

  • 數(shù)組方法里map, filter, reduce 簡直是箭頭函數(shù)的快樂老家!
    .map(n => n * 2)
  • 回調(diào)函數(shù)里:比如 setTimeout, Promise.then
  • 對(duì)象方法里(要小心):如果你想讓 this 指向?qū)ο蟊旧恚?strong>不要用箭頭函數(shù)定義方法!
    const obj = { val: 1, getVal: () => this.val }; // this指向window,不是obj

?? 總結(jié)一下

特性 傳統(tǒng)函數(shù) 箭頭函數(shù)
語法 啰嗦 簡潔
this 指向 誰調(diào)用指向誰 定義時(shí)就確定(繼承外層)
arguments 無(用 ...args)
new 關(guān)鍵字 可以 不可以

好啦,今天的ES6箭頭函數(shù)小課堂就到這里!是不是感覺任督二脈被打通了??? 趕緊去代碼里試一試吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容