ES6 學習筆記(二) 箭頭函數的 this

ES6 學習筆記(二) 箭頭函數的 this


那麼在先前已經學習過了箭頭函數的寫法,有沒有又覺得自己又潮了一點,箭頭函數並不只是單純寫法上的改變,另一個好處是箭頭函數的 this 是綁定父級作用域的,這麼說不太清楚不如直接看程式碼比較快。

範例

先來一段常常會見到的錯誤範例

  const person = {

    name: 'jimmy',
    skills: ['html', 'css', 'php', 'js', 'vue', 'drupal', 'wordpress', 'laravel'],
    getSkills: function () {
      this.skills.map(function (skill) {
        // console.log(this) 會是 Window
        console.log(`${this.name}會 ${skill} 技能`)
      })
    }
  }

  person.getSkills()

得到的輸出會是

會 html 技能
會 css 技能
會 php 技能
會 js 技能
會 vue 技能
會 drupal 技能
會 wordpress 技能
會 laravel 技能

當然稍微有踩過地雷的都會知道 this 在這邊會是 Window ,那麼是為什麼呢?因為 map 調用的是回調函數,所以

function (skill) {
        // console.log(this) 會是 Window
        console.log(`${this.name}會 ${skill} 技能`)
      }

這整段是一個單獨的函數,所以他的 this 會指向 Window。

那麼如果我們用箭頭函數來改寫呢?

  const person = {

    name: 'jimmy',
    skills: ['html', 'css', 'php', 'js', 'vue', 'drupal', 'wordpress', 'laravel'],
    getSkills: function () {
      this.skills.map( (skill) => {
        console.log(`${this.name}會 ${skill} 技能`)
      })
    }
  }

結果當然會是

jimmy會 html 技能
jimmy會 css 技能
jimmy會 php 技能
jimmy會 js 技能
jimmy會 vue 技能
jimmy會 drupal 技能
jimmy會 wordpress 技能
jimmy會 laravel 技能

那麼這是為什麼呢?因為 箭頭函數的 this 是會繼承父級作用域的,原本的寫法 this 是動態綁定的 所以我們使用 es6 的箭頭函數就可以不用擔心 this 值會一直變動的問題了