
JavaScriptのthis、奥が深いけど使いこなせるとマジ便利!いろんな場面でのthisを徹底解説するよ!
JavaScriptのthisキーワードとは?基本を理解しよう
JavaScriptにおけるthis
キーワードは、他の言語とは少し異なる振る舞いをします。this
は、関数がどのように呼び出されたかに基づいて、その値が決定される特別なキーワードです。つまり、this
は「誰が」その関数を呼び出したのかを示す参照のようなものです。
this
を理解することは、JavaScriptでオブジェクト指向プログラミングを行う上で非常に重要になります。this
の値を正しく把握することで、コードの挙動を予測し、意図した通りの動作をさせることが可能になります。
この記事では、this
キーワードの基本的な意味と、様々な状況下でのthis
の値について詳しく解説します。
thisキーワードの4つのパターン
this
の値は、主に以下の4つのパターンで決定されます。
1. グローバルコンテキスト: グローバルスコープ(ブラウザではwindow
オブジェクト、Node.jsではglobal
オブジェクト)でthis
を使用した場合。
2. 関数コンテキスト: 関数がどのように呼び出されたか(直接呼び出し、メソッド呼び出しなど)。
3. メソッドコンテキスト: オブジェクトのメソッドとして関数が呼び出された場合。
4. コンストラクタコンテキスト: new
キーワードを使ってコンストラクタ関数が呼び出された場合。
それぞれのパターンについて、具体的なコード例を交えながら見ていきましょう。
1. グローバルコンテキストでのthis
グローバルコンテキストでは、this
はグローバルオブジェクトを参照します。ブラウザ環境ではwindow
オブジェクト、Node.js環境ではglobal
オブジェクトになります。
console.log(this === window); // ブラウザ環境ではtrue
console.log(this); // ブラウザ環境ではwindowオブジェクトが表示される
2. 関数コンテキストでのthis
関数が単独で呼び出された場合(メソッドとしてではなく)、strictモードでなければ、this
はグローバルオブジェクトを参照します。strictモードでは、this
はundefined
になります。
function myFunction() {
console.log(this);
}
myFunction(); // strictモードでなければwindowオブジェクト、strictモードならundefined
'use strict';
function myFunctionStrict() {
console.log(this);
}
myFunctionStrict(); // undefined
3. メソッドコンテキストでのthis
オブジェクトのメソッドとして関数が呼び出された場合、this
はそのオブジェクト自身を参照します。
const myObject = {
myMethod: function() {
console.log(this);
}
};
myObject.myMethod(); // myObjectオブジェクトが表示される
4. コンストラクタコンテキストでのthis
new
キーワードを使ってコンストラクタ関数を呼び出すと、新しいオブジェクトが作成され、そのオブジェクトがthis
として関数内で使用されます。
function MyConstructor() {
this.myProperty = 'Hello';
console.log(this);
}
const myInstance = new MyConstructor(); // MyConstructorのインスタンスが表示される
console.log(myInstance.myProperty); // 'Hello'
bind、call、applyメソッドでthisを制御する
JavaScriptには、bind
、call
、apply
という3つのメソッドがあり、これらを使用すると、関数のthis
の値を明示的に設定できます。
call
とapply
は関数を即座に実行しますが、bind
は新しい関数を返します。
function sayHello() {
console.log('Hello, ' + this.name);
}
const person = { name: 'Alice' };
// call
sayHello.call(person); // Hello, Alice
// apply
sayHello.apply(person); // Hello, Alice
// bind
const boundFunction = sayHello.bind(person);
boundFunction(); // Hello, Alice
アロー関数とthis
アロー関数は、独自のthis
コンテキストを持ちません。アロー関数内のthis
は、そのアロー関数が定義された場所のthis
を引き継ぎます(レキシカルスコープ)。
const myObject = {
myMethod: function() {
const arrowFunction = () => {
console.log(this); // myObjectオブジェクトが表示される
};
arrowFunction();
}
};
myObject.myMethod();
参考リンク
まとめ
this
キーワードはJavaScriptにおいて非常に重要な概念であり、その挙動を理解することは、より高度なJavaScriptプログラミングを行う上で不可欠です。この記事を参考に、this
キーワードをマスターし、より自信を持ってJavaScriptコードを書けるようにしましょう。