JavaScript ES6 Arrow Functions 箭頭函數

ES6 允許我們用箭頭 => 來更方便簡短的定義一個函數,這種語法稱作 Arrow Functions。

Arrow Functions 由參數列 (...) 接著 => 和函數內容所組成。

語法:

// 如果有多行函數內容,跟一般函數一樣,用大括號 {} 包住
(param1, param2, …, paramN) => { statements }

// 可以用 return 返回值
(param1, param2, …, paramN) => { return expression; }

// 如果只有一行 expression 語句,可以省略大括號 {}
// 同時 expression 的值,會被當作是函數返回值
(param1, param2, …, paramN) => expression

// 如果只有一個參數,可以省略參數小括號 ()
(singleParam) => { statements }
singleParam => { statements }

// 如果沒有參數,必須留著空的小括號 (),不能省略
() => { statements }
() => expression

例子 1:

// 傳統標準的函數宣告語法
var multiply = function(a, b) {
    return a * b;
};

// 使用 Arrow Functions 的語法
var multiply = (a, b) => a * b;

// 20
multiply(2, 10)

例子 2:

let numbers = [1, 2, 3];

// callback 用 Arrow Functions 的寫法更精簡
let doubles = numbers.map(num => {
    return num * 2;
});

// [2, 4, 6]
console.log(doubles);

Binding of this

Arrow Functions 不僅只是提供一個更簡潔的語法,另外一個重要的特性是 Arrow Functions 會自動綁定 (bind) this 到宣告 Arrow Functions 當時的環境 (context)。

先來看傳統標準的函數宣告:

function Person() {
    this.age = 0;

    setInterval(function growUp() {
        // 這邊的 this 會指向 window,造成程式錯誤
        this.age++;
    }, 1000);
}

var p = new Person();

針對這問題,傳統的解法像是:

function Person() {
    // 先將正確的 this reference 存到一個變數中
    var self = this;
    self.age = 0;

    setInterval(function growUp() {
        // self 變數會正確的指向 Person 物件
        self.age++;
    }, 1000);
}

Arrow Functions 最有用的特性之一,就是會自動綁定 this 到函數定義時的環境:

function Person() {
    this.age = 0;

    // 定義該 Arrow Functions 時的環境,是在 Person 物件中
    setInterval(() => {
        // 所以 this 會正確指向 Person 物件
        this.age++;
    }, 1000);
}

var p = new Person();
IE 最新版瀏覽器 IE11 還不支援 Arrow Functions。