結論
メソッド内でコールバック関数を書くときは、Arrow function を使うと便利です。
理由
Arrow function の this
は、暗黙的な引数として this
を受け取らず、関数が定義されたスコープの this
を参照します。
この特性により、Arrow function を使うと単純に this
を使うことができます。
例えば、次のコードを見てください:
class Timer {
constructor() {
this.seconds = 0;
}
start() {
setInterval(function () {
this.seconds++;
console.log(this.seconds);
}, 1000);
}
}
const timer = new Timer();
timer.start(); // ここでの this は Timer インスタンスを指していないため、エラーになります。
上記の例では、通常の function を使うと this
が setInterval
のコンテキストを指すため、this.seconds
は定義されていないというエラーになります。
一方、Arrow function を使うと次のように動作します:
class Timer {
constructor() {
this.seconds = 0;
}
start() {
setInterval(() => {
this.seconds++;
console.log(this.seconds);
}, 1000);
}
}
const timer = new Timer();
timer.start(); // ここでの this は Timer インスタンスを指すため、秒数が正しくカウントされます。
このように、Arrow function を使うと、this
が Timer インスタンスを正しく指すため、コールバック関数内でも簡単に this
を扱うことができます。
メソッド内でコールバック関数を書くとき以外は?
複雑なthis
のバインディングや、プロトタイプチェーンを使うときを除いて、通常の function と Arrow function のどちらを使っても問題なさそうです。
個人的には、上記の通りthisの扱いが簡単になるのでArrow functionに統一しても良いかなと思っています。
現場に合わせておくのが無難かもですね。