this — *JavaScript の謎*
this — *JavaScript の謎*
🎯 このレッスンを読み終えたら
このレッスンを読み終えると、以下の3つを自信を持ってできるようになります。
- ▸✅ 通常の関数の
thisが呼び出しコンテキストによって変わるルール - ▸✅ アロー関数の
thisバインディングの違い - ▸✅
call・apply・bindを使うべきタイミング
学習目標をチェックリストとして持ち、すべて答えられるようになったらレッスンを閉じてください。
this は *4つの方法* で決まる
核心を一言で
JS の this は、関数がどのように呼び出されるか によって 4通り に決まります。他の言語と最も 異なる点。一度覚えれば一生もの。
1. デフォルト呼び出し — グローバルまたは undefined
通常の関数呼び出しは 呼び出しコンテキストなし → グローバルオブジェクトまたは undefined。
2. メソッド呼び出し — ドットの前にあるオブジェクト
user.greet(); // "山田太郎" ← user.greet() → this = user
// ⚠️ ポイント: 呼び出し時点のドットの前が this — 同じ関数でも呼び出し方によって異なる!
const fn = user.greet; // 関数だけ変数に取り出す(user から切り離される)
fn(); // undefined ← ドットなしで呼び出し → this = グローバル(または undefined)
// → this.name = グローバルに name がない → undefined
javascriptfunction User(name) {
// 🆕 new と一緒に呼び出されると、新しい空のオブジェクト { } が this になる
new キーワードと一緒に呼び出すと 新しいオブジェクト が生成され、そのオブジェクトが this になります。
4. 明示的バインディング — call・apply・bind
アロー関数 — this を持たない
javascript// アロー関数 — this = 周囲のスコープ(ここではグローバル)
method2: () => this.name, // undefined
};
console.log(obj.method1()); // "ホン" ← 通常の関数: this = obj
console.log(obj.method2()); // undefined ← アロー: this が obj ではない!
javascriptclass Counter {
constructor() { this.count = 0; }
start() {
setTimeout(() => {
this.count++; // ✅ Counter の this がそのまま使われる
}, 1000);
React での使い方
関数コンポーネント(現代の標準)では this 自体を使わない。Hook が代わりになる。
決定順序(暗記不要、参考まで)
1. new? → 新しいオブジェクト
2. call・apply・bind で明示? → そのオブジェクト
3. obj.method() ドット記法? → そのオブジェクト
4. それ以外 → グローバル / undefined (strict)
まとめ
- ▸this は 呼び出し方 によって決まる
- ▸メソッド呼び出し → ドットの前のオブジェクト
- ▸
new呼び出し → 新しいインスタンス - ▸
bind・call・applyで明示的に指定可能 - ▸アロー関数は自身の this を持たない — 最も安全な選択
⚡ 実際に試してみよう — this の4つの呼び出し方
🤖 AI にはこう依頼してみよう
このレッスンの概念を理解すれば、AI に 具体的に 指示できるようになります。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の出発点です。
- ▸「このコールバックの this バインディング問題をアロー関数または bind で直して」
- ▸「このクラスメソッドを明示的な .bind(this) で安定させて」
- ▸「このコードで strict mode をオンにしたときの this の動作の違いを教えて」
なぜこれがトークンを減らすのか
概念を知らないと、AI の回答を受け取っても 「それって何ですか?」 とまた聞き直さなければなりません。その「聞き直し」がトークンを消費します。概念を一度覚えておけば、会話が一度で 終わります。