JavaScriptのアロー関数のthis完全ガイド!初心者でもわかる挙動と使い方
生徒
「先生、JavaScriptのアロー関数って普通の関数と何が違うんですか?」
先生
「アロー関数の大きな特徴はthisの扱い方です。普通の関数は呼ばれた場所によってthisが変わりますが、アロー関数は定義された場所のthisをそのまま使います。」
生徒
「それって具体的にどういうことですか?」
先生
「例えばオブジェクトの中で関数を呼ぶと、普通の関数ではthisはそのオブジェクトを指します。でもアロー関数だと、外側のthis、つまり定義された場所のthisを使うんです。」
1. アロー関数とは?
JavaScriptのアロー関数は、ES6から導入された短い書き方の関数です。functionキーワードを使わずに書け、コードを簡潔にできます。
const add = (a, b) => {
return a + b;
};
console.log(add(2, 3)); // 5
アロー関数の特徴は、簡単に書けることだけでなく、thisの扱い方が通常の関数と違う点にあります。
2. 通常の関数のthisの挙動
通常の関数では、thisは関数が呼ばれた「場所」によって変わります。オブジェクトのメソッドとして呼べばそのオブジェクトを指し、単独で呼べばグローバルオブジェクト(ブラウザならwindow)を指します。
function normalFunc() {
console.log(this);
}
normalFunc(); // window(ブラウザの場合)
const obj = {
name: "Alice",
greet: normalFunc
};
obj.greet(); // { name: "Alice", greet: f }
このように、通常の関数では呼び出し方によってthisの値が変わります。
3. アロー関数のthisの特徴
アロー関数では、thisは「定義された場所」のthisを使います。呼び出し方に関係なく、外側のthisを参照します。
const obj = {
name: "Bob",
greet: () => {
console.log(this.name);
}
};
obj.greet(); // undefined
この例では、アロー関数はobjのthisを使わず、外側のthis(グローバル)を参照するため、名前は取得できません。
4. オブジェクト内でのアロー関数の使い方
アロー関数はオブジェクトのメソッドとして使う場合、外側のthisが必要なケースに便利です。特にコールバック関数の中で役立ちます。
const obj = {
name: "Charlie",
hobbies: ["読書", "プログラミング"],
showHobbies: function() {
this.hobbies.forEach(hobby => {
console.log(`${this.name}の趣味: ${hobby}`);
});
}
};
obj.showHobbies();
// Charlieの趣味: 読書
// Charlieの趣味: プログラミング
ここでは、forEachの中でアロー関数を使うことで、this.nameが正しくobjを指します。
5. イベントリスナーでのthisとアロー関数
ブラウザでのイベント処理でもアロー関数のthisは便利です。通常の関数ではイベント対象の要素をthisで取得できますが、アロー関数を使うと外側のthisを使えます。
const button = document.querySelector("#myButton");
button.addEventListener("click", () => {
console.log(this); // グローバルオブジェクト
});
イベント内でオブジェクトのthisを保持したい場合は、通常の関数を使いましょう。
6. アロー関数とコンストラクタ関数
アロー関数はコンストラクタ関数として使うことはできません。なぜなら、アロー関数には自分のthisがないため、newで呼ぶとエラーになります。
const Person = (name) => {
this.name = name;
};
const p = new Person("David"); // エラー
コンストラクタとして使う場合は、通常の関数を使いましょう。
7. アロー関数のまとめポイント
- アロー関数は定義場所の
thisを使う - メソッドとしてオブジェクトに直接割り当てる場合は注意が必要
- コールバック関数や配列操作で便利
- コンストラクタ関数としては使えない
8. アロー関数の使いどころ例
非同期処理や配列操作、簡単な短い関数などでアロー関数は非常に便利です。
const numbers = [1, 2, 3];
const squares = numbers.map(n => n * n);
console.log(squares); // [1, 4, 9]
setTimeout(() => {
console.log("3秒経過しました");
}, 3000);
このように、簡潔でthisの扱いを気にせず書ける場面で役立ちます。
まとめ
今回の記事では、JavaScriptのアロー関数の基本からthisの挙動、オブジェクト内やイベントリスナーでの使い方、コンストラクタ関数としての注意点まで幅広く解説しました。アロー関数は短い構文で書けるだけでなく、特にthisのスコープの固定という特徴があります。通常の関数では呼び出し方によりthisが変わりますが、アロー関数は定義された場所のthisを保持するため、配列操作やコールバック関数、非同期処理の中で便利に使えます。
オブジェクトのメソッドとして使う場合は、外側のthisが参照されるため、場合によっては通常の関数を使った方が適切です。また、アロー関数はコンストラクタとして利用できないため、newでインスタンスを作る場合は通常の関数を用いる必要があります。イベントリスナーでは、アロー関数を使うと外側のthisを保持でき、短く簡潔なコードを書くことが可能です。逆にイベントのターゲット要素をthisで参照したい場合は、従来の関数を使う必要があります。
まとめると、アロー関数は以下のポイントを押さえると理解が深まります。
- 定義場所の
thisを使う - オブジェクトのメソッドとして割り当てる場合は挙動に注意
- 配列操作やコールバック関数で便利
- コンストラクタ関数としては使えない
- 非同期処理や短い関数に向いている
サンプルとして、配列の要素を二乗する処理や、3秒後にメッセージを表示する非同期処理も紹介しました。これらの例から、アロー関数が短く書けるだけでなく、thisを固定できる利便性がわかります。
const numbers = [1, 2, 3]; const squares = numbers.map(n => n * n); console.log(squares); // [1, 4, 9]
setTimeout(() => {
console.log("3秒経過しました");
}, 3000);
このようにアロー関数は、コードを簡潔に保ちながら、特にthisの扱いに柔軟性を持たせたい場合に役立つ関数です。使いどころを理解し、通常の関数との違いを意識することで、より安全で読みやすいJavaScriptコードを書くことができます。
生徒
「先生、アロー関数のthisの扱い方、やっとわかりました。定義した場所のthisを使うんですね。」
先生
「その通りです。例えばオブジェクトの中でforEachなどのコールバック関数を使うとき、アロー関数を使えば外側のthisをそのまま参照できます。」
生徒
「なるほど。イベントリスナーではどう使えばいいですか?」
先生
「イベントリスナーでも、アロー関数を使うと外側のthisを保持できます。ただし、クリックした要素自体をthisで扱いたい場合は通常の関数を使う必要があります。」
生徒
「あ、だからオブジェクトのメソッドにアロー関数を直接割り当てると、思ったthisにならないんですね。」
先生
「その通りです。アロー関数の特徴を理解して、適材適所で使い分けることが大切です。短く簡潔に書けるので、配列操作や非同期処理では特に便利ですよ。」
生徒
「先生、理解しました。通常の関数とアロー関数を場面に応じて使い分けます!」