JavaScript | アロー関数のthis

JavaScript JavaScript
スポンサーリンク

アロー関数のthisを初心者向けにやさしく解説

JavaScriptを学び始めると「thisってややこしい!」と感じる人が多いです。特にアロー関数は、普通の関数とthisの動きが違うので混乱しやすいポイントです。ここでは、かみ砕いて説明します。


基本の考え方

  • 普通の関数
    thisは「呼び出し方」で決まります。
    → どのオブジェクトから呼ばれたかによって変わる。
  • アロー関数
    thisは「書かれた場所」で決まります。
    → 外側のスコープのthisをそのまま引き継ぐ(固定される)。

例1: 普通の関数とアロー関数の違い

const obj = {
  name: "Alice",
  normalFunc: function() {
    console.log(this.name);
  },
  arrowFunc: () => {
    console.log(this.name);
  }
};

obj.normalFunc(); // "Alice"
obj.arrowFunc();  // undefined(外側のthisを参照するため)
JavaScript
  • normalFunc は「objから呼ばれた」ので thisobj
  • arrowFunc は「objの中に書いてあるけど、thisは外側(グローバル)」を参照するので undefined

例2: setTimeoutでの違い

function Timer() {
  this.seconds = 0;

  // 普通の関数
  setInterval(function() {
    this.seconds++;
    console.log("普通:", this.seconds);
  }, 1000);

  // アロー関数
  setInterval(() => {
    this.seconds++;
    console.log("アロー:", this.seconds);
  }, 1000);
}

new Timer();
JavaScript
  • 普通の関数 → thissetIntervalが呼び出すときのthis(グローバル)になるので、this.secondsはエラーやNaNになる。
  • アロー関数 → 外側のthis(Timerインスタンス)をそのまま使うので、秒数が正しくカウントされる。

例3: イベントリスナーでの違い

const button = document.querySelector("button");

// 普通の関数
button.addEventListener("click", function() {
  console.log(this); // クリックされたbutton要素
});

// アロー関数
button.addEventListener("click", () => {
  console.log(this); // 外側のthis(windowなど)
});
JavaScript
  • イベントで「クリックされた要素」をthisで使いたいなら普通の関数
  • 外側のthisをそのまま使いたいならアロー関数

まとめ(使い分けのコツ)

  • アロー関数を使うと便利な場面
    • コールバック関数(setTimeout, setInterval, Promise.then など)
    • クラスのメソッド内で「外側のthisを保持したい」とき
  • 普通の関数を使うべき場面
    • オブジェクトのメソッド
    • イベントリスナーでthisを要素として使いたいとき
    • call / apply / bindthisを切り替えたいとき

👉 初心者向けに一言でまとめると:
「アロー関数のthisは外側に固定される。普通の関数のthisは呼び出し方で変わる」
これを頭に入れておけば、だいぶスッキリ理解できます。

タイトルとURLをコピーしました