thisとは何か?

thisは、JavaScriptで「現在の処理で参照しているオブジェクト」を表す特別なキーワードです。
ただし、thisが何を指すかは関数がどのように呼び出されたかによって変わります。そのため、JavaScriptの中でも特に理解が難しい機能の一つとされています。
オブジェクトのメソッド内でのthis
オブジェクトのメソッド内では、thisはそのメソッドを呼び出したオブジェクトを指します。
const person = {
name: "Taro",
age: 25,
greet() {
console.log("こんにちは " + this.name);
}
};
person.greet(); // こんにちは Taro
この例では、thisはpersonオブジェクトを指しているため、this.nameはperson.nameになります。
通常の関数でのthis
通常の関数では、thisは呼び出し方によって変化します。
function showThis() {
console.log(this);
}
showThis();
ブラウザでは通常モードではwindow、厳密モードではundefinedになります。
| 実行環境 | 通常モード | strictモード |
|---|---|---|
| ブラウザ | window |
undefined |
| Node.js(ES Modules) | undefined |
undefined |
| Node.js(CommonJS) | 環境により異なる | undefined |
グローバルスコープでのthis
グローバルスコープのthisも実行環境によって異なります。
console.log(this);
| 環境 | this |
|---|---|
| ブラウザ(通常のscript) | window |
| ES Modules | undefined |
| Node.js(CommonJS) | module.exports |
近年はES Modulesが主流になっているため、グローバルのthisはundefinedになるケースも多くなっています。
コールバック関数でのthis
メソッドをそのままコールバック関数として渡すと、thisが元のオブジェクトではなくなります。
const person = {
name: "Taro",
greet() {
console.log("こんにちは " + this.name);
}
};
setTimeout(person.greet, 1000);
この場合、greetは単なる関数として呼び出されるため、thisはpersonではありません。その結果、this.nameはundefinedになります。
bindでthisを固定する
bind()を使用すると、thisを任意のオブジェクトへ固定できます。
const person = {
name: "Taro",
greet() {
console.log("こんにちは " + this.name);
}
};
setTimeout(person.greet.bind(person), 1000);
この例では、bind()によってthisが常にpersonになるため、正しく名前が表示されます。
アロー関数のthis
アロー関数は通常の関数とは異なり、自分専用のthisを持ちません。
外側のスコープのthisをそのまま利用するため、「呼び出し方」でthisが変わることはありません。
const person = {
name: "Taro",
greet: () => {
console.log(this.name);
}
};
person.greet();
この例では、アロー関数はpersonを指さず、外側のthisを参照します。そのため、undefinedが表示されます。
一方で、通常のメソッド内でコールバックとしてアロー関数を使うと、外側のthisを維持できるため便利です。
const person = {
name: "Taro",
greet() {
setTimeout(() => {
console.log(this.name);
}, 1000);
}
};
person.greet(); // Taro
thisの参照先まとめ
| 呼び出し方 | thisが指すもの |
|---|---|
| オブジェクトのメソッド | そのオブジェクト |
| 通常の関数 | windowまたはundefined(strict) |
| bind() | bindで指定したオブジェクト |
| アロー関数 | 外側のスコープのthis |
| コンストラクター(new) | 新しく生成されたオブジェクト |
まとめ
thisは現在参照しているオブジェクトを表すキーワードである。- オブジェクトのメソッドでは、そのオブジェクト自身を指す。
- 通常の関数では呼び出し方によって参照先が変わる。
bind()を使うとthisを固定できる。- アロー関数は外側の
thisを引き継ぐ。 thisはJavaScriptの中でも特に重要な概念であり、呼び出し方による違いを理解することが大切である。