レキシカルな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: 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 を取得し、呼び出し時には変更しません。
// 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 を失うことがよくありますが、アロー関数は外側の 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();

取り出したメソッドの簡単な対処法
メソッドを取り出した場合は、オブジェクトを保持する小さな アロー関数で包むか、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());

よい習慣
ヒント:
- メソッドでは obj.method() として呼び出し、this がオブジェクトになるようにします。
- コールバックでは、レキシカルな this を維持するために アロー関数を優先します。
- 取り出したメソッドは this を失います。アロー関数で包むか bind してください。

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

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

よくある質問
「レキシカルな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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- レキシカルなthisと動的なthis、アロー関数再入門
- メソッド抽出の落とし穴と部分適用
- 関数型の代替案 — コンテキスト、クロージャ、ヘルパー