0Pricing
JavaScript Academy · レッスン

レキシカルなthisと動的なthis、アロー関数再入門

動的なthisが呼び出し元によって決まり、アロー関数がレキシカルなthisをキャプチャする仕組みを、明快な小さな例で学びます。

「レキシカルなthisと動的なthis、アロー関数再入門」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。

全体像

目標: this がどこを指すのかを理解します。

  • 動的な this: 呼び出し位置で決まります
  • アロー関数の this: レキシカルに取り込まれます
  • よくある落とし穴: メソッドを取り出すと this を失います
  • コールバック内で this を維持するにはアロー関数を使います
レキシカルなthisと動的なthis、アロー関数再入門 — イラスト1

動的な this の例

動的な this: obj.method() として呼び出すと this = obj が設定されます。関数を取り出すとオブジェクトを失います。

// Dynamic this depends on HOW we call the function
const person = {
  name: "Ayla",
  say: function () {
    return "Hi " + this.name;
  }
};

console.log("method call:", person.say()); // "Hi Ayla"

// Extract then call: this is lost
const talk = person.say;
console.log("extracted call:", talk()); // likely "Hi undefined" in strict mode -> this is undefined
レキシカルなthisと動的なthis、アロー関数再入門 — イラスト2

アロー関数 = レキシカルな this

アロー関数は作成時に周囲の関数またはオブジェクトのスコープから this を取得し、呼び出し時には変更しません。

// Arrow functions capture this from where they are created
const box = {
  label: "blue",
  showLater: function () {
    // Arrow keeps this === box
    const fn = () => "box:" + this.label;
    return fn();
  }
};

console.log("arrow captured this:", box.showLater()); // "box:blue"
レキシカルなthisと動的なthis、アロー関数再入門 — イラスト3

コールバックでアロー関数を使って this を維持する

コールバックでは、通常の関数は this を失うことがよくありますが、アロー関数は外側の this をそのまま維持します。

// Using a normal function in a callback can lose this
const widget = {
  id: 7,
  normal: function () {
    setTimeout(function () {
      // here this is not widget in many environments
      console.log("normal cb this.id:", this && this.id);
    }, 0);
  },
  arrow: function () {
    setTimeout(() => {
      // arrow keeps lexical this from arrow()
      console.log("arrow cb this.id:", this.id);
    }, 0);
  }
};

widget.normal();
widget.arrow();
レキシカルなthisと動的なthis、アロー関数再入門 — イラスト4

取り出したメソッドの簡単な対処法

メソッドを取り出した場合は、オブジェクトを保持する小さな アロー関数で包むか、bind してください(次のレッスンで扱います)。初心者向けにシンプルに保ちます。

// If you must extract, wrap with an arrow capturing the object
const account = {
  owner: "Mila",
  label: function () { return "Owner:" + this.owner; }
};

// Lost this:
const lost = account.label;
console.log("lost:", lost()); // "Owner:undefined" (this missing)

// Fixed: create an arrow that closes over account
const safe = () => account.label();
console.log("fixed via arrow wrapper:", safe());
レキシカルなthisと動的なthis、アロー関数再入門 — イラスト5

よい習慣

ヒント:

  • メソッドでは obj.method() として呼び出し、this がオブジェクトになるようにします。
  • コールバックでは、レキシカルな this を維持するために アロー関数を優先します。
  • 取り出したメソッドは this を失います。アロー関数で包むか bind してください。
レキシカルなthisと動的なthis、アロー関数再入門 — イラスト6

アロー関数の this クイズ

簡単な確認: アロー関数の this の動作です。

レキシカルなthisと動的なthis、アロー関数再入門 — イラスト7

まとめ

まとめ: 通常の関数では this は動的(呼び出し位置で設定)であり、アロー関数ではレキシカル(作成時の場所で取り込まれる)です。コールバックではアロー関数を使い、取り出したメソッドは包んで、動作をシンプルに保ちます。

レキシカルなthisと動的なthis、アロー関数再入門 — イラスト8

よくある質問

「レキシカルなthisと動的なthis、アロー関数再入門」レッスンは無料ですか?

はい。「レキシカルなthisと動的なthis、アロー関数再入門」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全3レッスンが含まれています。

「レキシカルなthisと動的なthis、アロー関数再入門」で何を学びますか?

動的なthisが呼び出し元によって決まり、アロー関数がレキシカルなthisをキャプチャする仕組みを、明快な小さな例で学びます。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「レキシカルなthisと動的なthis、アロー関数再入門」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. レキシカルなthisと動的なthis、アロー関数再入門
  2. メソッド抽出の落とし穴と部分適用
  3. 関数型の代替案 — コンテキスト、クロージャ、ヘルパー
← JavaScript Academyに戻る