【入門編】 関数環境レコードとthisバインディング – JavaScript実践ガイド

こんにちは!フロントエンドの世界へようこそ。
JavaScriptを触り始めて、「`this`って何なんだ……?」「なぜ急に値が変わるんだ!」と頭を抱えたことはありませんか?大丈夫、それはあなたがプロへの道を確実に歩んでいる証拠です。

今日は、JavaScriptという巨大なシステムが、関数を実行する時に裏側でどんな「メモ帳」を用意しているのか。そして、そのメモ帳に書かれた特別な役割「`this`」の正体について、少しだけ紐解いてみましょう。

—

1. 関数は「自分専用の個室」を持っている

JavaScriptで関数を実行する瞬間、メモリの中では「環境レコード(Environment Record)」という、いわば「その関数専用の個室」が作られます。

この個室には、あなたが書いた変数だけでなく、JavaScriptがこっそり準備している「特別な情報」が書き込まれます。それが`this`と`super`です。

想像してみてください:お買い物のレシート

コンビニでお買い物をする時、レシートには必ず「店舗名」が印字されますよね。あなたがどの店舗にいるのかを教えてくれる、あの情報です。

JavaScriptの関数にとっての`this`は、まさにその「今、誰の持ち物として呼ばれているか」というレシートのようなものなんです。

—

2. `this`の正体は「呼ばれ方」で決まる

`this`が厄介なのは、中身が「誰に呼ばれたか」によってコロコロ変わるからです。

const 秘密基地 = {
名前: “フロントエンド研究所”,
挨拶: function() {
// ここでのthisは「秘密基地」そのものを指す
console.log(this.名前 + “へようこそ!”);
}
};

秘密基地.挨拶(); // 「フロントエンド研究所へようこそ!」と表示される

このコードでは、`挨拶`関数は「`秘密基地`というオブジェクト」から呼び出されました。だから、`this`は「あ、僕は今、秘密基地さんの担当ですね」と理解して、名前を参照できるんです。

でも、こんな時は混乱しますよね?

const 挨拶のコピー = 秘密基地.挨拶;
挨拶のコピー(); // エラー、またはundefinedになる可能性大!

コピーした瞬間、この関数は「誰の持ち物でもない、ただの関数」になってしまいました。レシートに店名が載っていない状態です。こうなると、JavaScriptは「あれ? `this`って誰だっけ?」とパニックを起こしてしまいます。

—

3. なぜ「環境レコード」が重要なのか

JavaScriptは関数を実行するたびに、この環境レコードを新しく作り直します。

  • 変数: その部屋の中だけで使うメモ。
  • `this`: その部屋の持ち主を指し示す看板。

この仕組みがあるおかげで、同じ関数を使い回しても、呼び出す相手が違えば`this`が適切に入れ替わり、柔軟なプログラムが書けるようになっています。

実は、ES6(現代のJavaScript)で登場したアロー関数は、この個室に「`this`という名前の看板」をそもそも持ち込みません。その代わり、外側の部屋の看板をそのまま使うというルールになっています。だから「`this`が勝手に変わらない」という安心感があるんですね。

—

4. 実践的なアドバイス:迷ったらこう考えよう!

「`this`が分からなくなった!」という時は、コードの行間を読んでこう自問してみてください。

「今、この関数を呼び出した『ドット(.)の左側』にいるのは誰?」

  • `obj.func()` なら、`this` は `obj` です。
  • `func()` と直接呼んでいるなら、それは「誰の持ち物でもない」ので、`this` は迷子(またはグローバルな窓口)になります。

—

最後に:完璧じゃなくていいんです

プロの現場でも、複雑な`this`の挙動に頭を悩ませることはあります。そんな時は`console.log(this)`を仕込んで、「お前、今誰だ?」と確認する。それだけで十分、立派なデバッグです。

JavaScriptは、あなたを困らせようとして`this`を複雑にしているわけではありません。どんな状況でも柔軟に動けるように、あえて「呼び出し側に合わせる」という優しい(?)仕組みを用意してくれているんです。

まずは「`this`はレシートみたいなもの」と覚えておくだけで、視界が少し開けるはずですよ。

それでは、また次回の冒険でお会いしましょう!応援しています。

コメント

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