JavaScript|箭頭函數的用法

歡迎點擊「算法與編程之美」↑關注我們!

本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。

問題描述

JavaScript ES6標準新增了比較重要的一種新的函數:Arrow Function(箭頭函數),但大多數人都不能很好的瞭解箭頭函數的用法,也不能區別箭頭函數和function(),所以接下來我們就來介紹一下箭頭函數。

解決方案

1 箭頭函數的寫法

() => {}

//舉例

x => x*2 //x的返回值變成x*2的值

箭頭函數定義包括一個參數列表,函數體放在最後。

箭頭函數有兩種格式,一種只包含一個表達式,就如上面的舉例,你會發現它沒有return,因爲在箭頭函數中,只要一個表達式,並且省略了包圍的 { } 的話,就意味着表達式前面有一個隱含的 return。另一種格式就是,當箭頭函數包含多條語句,這個時候{ }和return 就不能省略,例如:

x => {

      if (x>0){

          return x*x

      }else{

         return x

      }

而當有多個參數就要用()將參數括起來:

(x,y) => {

      if (x>0){

          return x*y

      }else{

         return x+y

      }

2 箭頭函數this的指向

箭頭函數總是函數表達式;並不存在箭頭函數聲明。同時箭頭函數看上去是匿名函數(它們沒有用於遞歸或者事件綁定 / 解綁定的命名引用)的一種簡寫,但實際上,箭頭函數和匿名函數有個明顯的區別:箭頭函數內部的this是詞法作用域,由上下文確定。例如:

var ming = {

     birth: 1999,

     getAge: function () {

         var b = this.birth; // 1999

         var a = () => new Date().getFullYear() - this.birth; // this指向ming對象

         return a();

     }

};

ming.getAge();//

結果:

如上例子,箭頭函數中this總是指向語法作用域,也就是此處的外部調用者xiaoming對象,故而此處ming.getAge()的返回值爲21。

也就是說,使用箭頭函數,就不需要以前的那種hack寫法了:

var that = this;

由於this在箭頭函數中已經按照詞法作用域綁定了,所以用call()或者apply()調用函數的時候,無法對this 進行綁定,即傳入的第一個參數被忽略。例如:

var ming = {

     birth: 1999,

     getAge: function (year) {

         var b = this.birth; // 1999

         var a = (y) => y - this.birth; // this.birth仍是1999

         return a.call({birth:2000}, year);

     }

};

ming.getAge(2020);//21

結果:

3 箭頭函數與function()函數的區別

通過上面對於箭頭函數的講解就可以發現雖然有時候可以將function()函數變爲箭頭函數,但兩者還是有很大的區別的:

a.箭頭函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象;

b.箭頭函數不可以當作構造函數,也就是說,不可以使用new命令,否則會拋出一個錯誤;

c.箭頭函數不可以使用arguments對象,該對象在函數體內不存在。如果要用,可以用Rest參數代替;

d.不可以使用yield命令,因此箭頭函數不能用作Generator函數;

結語

箭頭函數中this的指向十分的重要,需要注意,有時候爲了節約時間,可以使用箭頭函數代替function()函數,在使用的時候一定要注意箭頭函數本身沒有this,它的this是根據上下文指向語法作用域的,所以小編在此建議,如果你還想用this,就最好不要用使用箭頭函數的寫法哦。

END

主       編   |   王楠嵐

責       編   |   楊金月

 where2go 團隊


   

微信號:算法與編程之美          

長按識別二維碼關注我們!

溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章