JavaScriptのアロー関数におけるthis
は、通常の関数におけるthis
を違うものを指すことがあります。本記事では、便利なアロー関数におけるthisの使い方を見てみましょう。
アロー関数とは?
そもそもアロー関数とはなんでしょうか。アロー関数はJavaScriptで関数を簡潔に書くための記述方法です。(詳しくはこちら)通常の関数と比べて文法が短く、特にthis
の振る舞いが大きく異なります。
通常の関数におけるthis
の振る舞い
JavaScriptでは、this
の値は関数がどのように呼び出されるかによって変わります。これが時として混乱を招くことがあります。例えば、オブジェクトのメソッド内でタイマーを設定する場合、以下のような問題が生じることがあります。
const myObject = {
value: 42,
showValue: function() {
setTimeout(function() {
console.log(this.value); // ここで`this`は`myObject`ではなく、`window`を指すため、undefinedになる
}, 1000);
}
};
myObject.showValue();
ここでは、this.value
で42という値を出力しようとしていますが、this
はwindow
を指すため、this.value
も値が定義されていないことになってしまいます。
アロー関数での解決
アロー関数を使うと、this
が自動的に外のスコープ(アロー関数を包んでいる関数やコンテキスト)のthis
と同じになります。つまり、アロー関数はその場所でのthis
を「記憶」します。上の例をアロー関数を使って書き直すと、以下のようになります。
const myObject = {
value: 42,
showValue: function() {
setTimeout(() => {
console.log(this.value); // アロー関数により、`this`は`myObject`を指し続ける
}, 1000);
}
};
myObject.showValue();
この場合、setTimeout
のコールバックで使われているアロー関数は、showValue
が呼び出されたときのthis
(ここではmyObject
)を使用します。そのため、期待通り42
が出力されます。
アロー関数は、this
が周囲のコンテキストから自動的に引き継がれるため、予期せぬthis
の値に悩まされることが少なくなります。これにより、特にイベント処理や非同期処理のコードが読みやすく、理解しやすくなります。