thisとは
呼び出し元のオブジェクトへの参照を保持するキーワードのこと
this
の参照先は、実行コンテキストによって変わります。
実行コンテキストには「グローバルコンテキスト」や「関数コンテキスト」があり、今回は関数コンテキストにおけるthis
について見ていきます。
関数コンテキストにおけるthis
の場合は、呼ばれた関数ごとに参照先が変化します。
consoleで「hello Taro」と表示する場合
const person = {
name: 'Taro',
hello: function () {
console.log('Hello ' + this.name);
},
};
この場合、this.name
のthis
は自身のオブジェクトのperson
を参照します。
helloメソッドを呼び出してみる
const person = {
name: 'Taro',
hello: function () {
console.log('Hello ' + this.name);
},
};
person.hello();
person.hello()
とすることで、person
オブジェクトのhello
メソッドを呼び出すことができます。
実行結果
Hello Taro
hello Taro
と出力されました。
person
というオブジェクトのメソッドとしてhello
が呼ばれた場合、hello
メソッドの中で呼び出されるthis
は呼び出し元のオブジェクトであるperson
を参照します。
thisをpersonに変えて呼び出してみる
const person = {
name: 'Taro',
hello: function () {
console.log('Hello ' + person.name); // thisをpersonに変更
},
};
person.hello();
実行結果
Hello Taro
同じように、hello Taro
と出力されました。
これは、変数person
がhello
メソッドのレキシカルスコープになるためです。
ただ、メソッドの中でそのオブジェクトを取得したい場合は基本的にthis
を使います。
まとめ
person
というオブジェクトのメソッドとしてhello
が呼ばれた時には、hello
メソッドの中で呼び出されるthis
は呼び出し元のオブジェクトであるperson
を参照します。
また、person
というオブジェクトの中のhello
メソッドは、メモリ空間のどこかに登録されているfunction
のことを指しています。また、同じようにname
プロパティは、メモリ空間のどこかに登録されているTom
という値への参照を保持しています。
この状態でperson
のhello
が呼ばれた場合、JavaScriptはperson
というオブジェクトを探しにいきます。そして、そのオブジェクトの中のhello
というメソッドを実行することで、Hello Tom
とコンソールに表示されます。
参考資料