JavaScript | 関数リテラルとアロー関数の this の違い

JavaScript JavaScript
スポンサーリンク

では 関数リテラル(通常の function 式)とアロー関数の this の違い を初心者向けに、できるだけかみ砕いて説明します。実際にコードをブラウザで試すと理解が早いです。


1️⃣ 基本の考え方

  • 通常の関数(function 式)
    → 呼ばれたときの「呼び出し元」によって this が決まる
  • アロー関数(=>)
    → 作られたときの「周囲のスコープの this をそのまま使う」

つまり、アロー関数は「自分専用の this を作らない」のが特徴です。


2️⃣ 例で比較

let obj = {
  name: "太郎",
  regularFunc: function() {
    console.log("regularFunc:", this.name);
  },
  arrowFunc: () => {
    console.log("arrowFunc:", this.name);
  }
};

obj.regularFunc(); // → "太郎"
obj.arrowFunc();   // → undefined(ブラウザの場合)
JavaScript

解説:

  • regularFunc は obj のメソッドとして呼ばれたので this = objthis.name = "太郎"
  • arrowFunc はアロー関数で作られており、定義されたスコープの this を使う
    → グローバルスコープだと this.name は undefined

3️⃣ setTimeout での違い

let obj = {
  name: "花子",
  regularFunc: function() {
    setTimeout(function() {
      console.log("regularFunc in setTimeout:", this.name);
    }, 100);
  },
  arrowFunc: function() {
    setTimeout(() => {
      console.log("arrowFunc in setTimeout:", this.name);
    }, 100);
  }
};

obj.regularFunc(); // → undefined
obj.arrowFunc();   // → "花子"
JavaScript

解説:

  • regularFunc 内の普通の function は「setTimeout によって呼ばれるときの this = window(ブラウザ)」
  • arrowFunc 内のアロー関数は「外側 regularFunc の this = obj」をそのまま使う → this.name = "花子"

4️⃣ まとめ(初心者が押さえるポイント)

種類this の決まり方メモ
通常の関数呼び出されたときのオブジェクトメソッドやイベントで呼ぶと obj を指す
アロー関数定義された時の外側の thissetTimeout や forEach 内などで便利
  • ルール覚え方:「アロー関数は this を持たない → 外の this を使う」
  • 小さなオブジェクトやイベントハンドラで試すと理解しやすいです。

💡 初心者向けヒント:

  • メソッド内で this を使いたい場合 → 通常の function 式
  • コールバックや setTimeout の中で親の this を使いたい場合 → アロー関数
タイトルとURLをコピーしました