ES2015(ES6)備忘録〜アロー関数〜

@goran_nasai
こんにちは。GORAN
です。今回でES2015(ES6)
備忘録は(ひとまず)ひと区切りです。
アロー関数
関数式の代替構文。function
キーワードやreturn
文を省略して関数を記述できます。
function (a) {
return a + 100;
}
// "function" キーワードを省略できる
(a) => {
return a + 100;
}
// "{}" と "return" を省略できる
(a) => a + 100;
// "()" を省略できる
a => a + 100;
-
return
を省略できるのは、処理内容のステートメントが単一の場合だけです。- 厳密には、「ステートメントがひとつだけ(簡潔文体)のとき
{}
を省略できて、{}
省略時はステートメントの結果が返り値になるため、return
が不要になる(暗黙的にreturn
される)」という構図です。
- 厳密には、「ステートメントがひとつだけ(簡潔文体)のとき
()
を省略できるのは、引数が単一の場合だけです。
式の周りに()
が必要になります。
params => ({foo: "a"});
特に React で関数コンポーネントを記述する場合、「const
のreturn
文を省略するか」という命題があります。僕個人としてはこれまで「何となく」省略してこなかったんですが、一番文句言われなさそうな React コンポーネントの書き方を読んで、その「何となく」というのは「処理を足したくなったときに書き換えが生じることへの嫌悪感」だったんだと気づきまして、現在はその思想のもと、return
を省略しない記法で統一しています。
他のES2015
新機能と組み合わせた記述も可能です。
(a, b, ...r) => expression
(a = 400, b = 20, c) => expression
([a, b] = [10, 20]) => a + b;
({ a, b } = { a: 10, b: 20 }) => a + b;
this
への結び付けを持たない
アロー関数の最大の特徴であり、多くの JavaScript プログラムでアロー関数が採用されている理由のひとつでしょう。「this
への結び付けを持たない」というのはアロー関数が通常の関数と違って独自のスコープを持たず、アロー関数の外側と内側でスコープが保持されることを意味しています。言い換えれば、アロー関数はthis
を保有せず、レキシカルスコープのthis
を参照するということです。
このthis
の扱い方について、通常の関数との違いをコールバックを記述した場合で見てみます。
以下のコードでは、this
がobj
オブジェクトであることを期待していますが、実際にはsetTimeout
がwindow
スコープで実行され、count
プロパティはwindow
スコープではないため、コンソールにはNaN
が表示されます。
var obj = {
count: 10,
doSomethingLater: function () {
setTimeout(function () {
this.count++;
console.log(this.count);
}, 300);
},
};
obj.doSomethingLater();
アロー関数でコールバックを記述すると、this
はdoSomethingLater
関数の呼び出しのコンテキストであるobj
を指すため、期待した通りの実行結果が得られます。
var obj = {
count: 10,
doSomethingLater: function () {
setTimeout(() => {
this.count++;
console.log(this.count);
}, 300);
},
};
obj.doSomethingLater();
おわりに
次回は「チーム作り」だったり「Biz との関わり方」みたいなちょっとポエミーなものを書こうと思っています。