本文へスキップ
BecomeCoder

JavaScriptコース · 第8章 関数を深く知る ― スコープ・クロージャ・this · レッスン31

this の仕組み ― 呼び方で決まる

ブラウザで完結

導入

メソッドの中に出てくる this は、「その関数どう呼んだか」で中身が決まります。定義した場所ではなく、呼び出し方が鍵です。ここを押さえると、よくある this のハマりどころを避けられます。

説明

オブジェクト.メソッド() の形で呼ぶと、this はそのオブジェクトを指します。

const user = {
  name: "太郎",
  greet() {
    return `私は${this.name}`;   // this = user
  },
};
console.log(user.greet());  // 私は太郎

アロー関数は自分の this を持ちません。まわりのスコープthis をそのまま使います。この性質のおかげで、コールバックの中でも this がズレません。

const timer = {
  seconds: 0,
  tickAll() {
    [1, 2, 3].forEach(() => {
      this.seconds += 1;   // アロー関数なので this は timer のまま
    });
    return this.seconds;
  },
};
console.log(timer.tickAll());  // 3

もしここを普通の function () { ... } で書くと、その関数は自分の this を持ってしまい、this.secondstimer を指さなくなります。**「コールバックはアロー関数で書く」**と覚えておくと安全です。

// アローなら親の this を引き継ぐので、下の書き方は正しく動く
const counter = {
  n: 0,
  addMany(list) {
    list.forEach((v) => { this.n += v; });
    return this.n;
  },
};
console.log(counter.addMany([10, 20, 30]));  // 60

やってみよう

username を書き換えて greet() の結果が変わることや、forEach の中を普通の関数にすると this がおかしくなることを試してみましょう。

演習

name"ポチ" を持つオブジェクト dog を作り、this.name を使って ポチです と返すメソッド intro() を定義してください。intro() の結果を表示します。

ヒント1を見る

const dog = { name: "ポチ", intro() { return ${this.name}です; } }; console.log(dog.intro());

実際に動かしてみよう

下のエディタにJavaScriptを書いて「実行」を押すと、ブラウザ内のJavaScriptで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(console.log の結果が下に出ます。input() を使う回は「標準入力」欄に値を入れてから実行します)。

JavaScript — ブラウザ内で実行

ブラウザ本体のJavaScriptで実行する学習用環境を読み込みます(外部エンジン不要・軽量です)。
スクロールして表示された時点でも自動で読み込まれます。