JavaScriptのthisについて現役エンジニアが解説【初心者向け】
初心者向けにJavaScriptのthisについて現役エンジニアが解説しています。JavaScriptのthisとはJavaScriptのキーワードで、主に関数の実行コンテキストを参照します。JavaScriptのthisの使い方やStrictモードや関数の実行方法によるthisの違いについて説明します。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
監修してくれたメンター
mentor-hakamata
C#, Ruby, Python, JavaScriptなど経験。
JavaScriptのthisについて、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
thisは基本的に呼び出し元のオブジェクトを指すとなんとなく理解している方も多いのではないでしょうか。
実は呼び出し元によってthisの内容が変わりますので、しっかり理解していきましょう。
目次
そもそもJavaScriptについてよく分からないという方は、JavaScriptとは何なのかについて解説した記事を読むとさらに理解が深まります。
今回は、JavaScriptに関する内容だね!
どういう内容でしょうか?
JavaScriptのthisについて詳しく説明していくね!
お願いします!
thisとは
JavaScriptのキーワードで、主に呼び出し元のオブジェクトを表します。
「主に」と言うのは、関数の実行方法やJavaScriptのモードによってthisの値が変わるからです。
thisを呼び出すパターン
thisの呼び出し方は呼び出し元によっていくつかのパターンがあります。
メソッドと関数は同義ですが、ここではオブジェクトに定義された関数をメソッド、functionで定義された関数のことを関数とします。
メソッドで呼び出す場合
メソッドからthisを呼び出す場合は、そのメソッドが定義されているオブジェクトをthisで参照できます。
const human = { age: 20, hello() { console.log(`Hello, I am ${this.age} years old.`); } } human.hello(); // Hello, I am 20 years old.
上記の例では、humanというオブジェクトからhelloメソッドを呼び出しています。
helloメソッドではthis.ageを参照していますが、thisはhumanを指すため、age: 20の20を参照します。
関数で呼び出す場合
関数からthisを呼び出す場合は、グローバルオブジェクトを参照します。
グローバルオブジェクト = windowですので、windowにexampleプロパティを追加し、確認してみます。
window.example = "hello"; function hello(){ console.log(this.example); } hello(); // hello
出力内容がhelloとなるため、グローバルオブジェクトに定義したexampleプロパティを参照していることが分かります。
動作させる環境によっては出力結果が上記の通りにならない場合があります。
コンストラクタで呼び出す場合
コンストラクタからthisを呼び出す場合は、呼び出したオブジェクト自体を参照します。
const Human = function(name, age) { this.name = name; this.age = age; this.hello = function(){ console.log(`Hello, My name is ${this.name}. I am ${this.age} years old.`) } } const human = new Human("Tarou", 20); human.hello(); // Hello, My name is Tarou. I am 20 years old.
Humanクラスからインスタンスを生成し、helloメソッドを呼び出しています。
${this.name}は「tarou」、${this.age}は「20」となっていることから、 コンストラクタで指定した引数の値(インスタンスに設定した値)が表示されていることが分かります。
厳格モードでのthisの使用
JavaScriptにはStrictモードという、処理に制限を与え厳格に実行するモードが存在します。
Strictモードでは、エラーにはならないが意図と異なる動作になるような処理をエラーにすることで発見しやすくできます。
Strictモードの動作の1つとしてthisの値が変わるケースがありますのでご紹介します。
まずはtestという名前の関数を作成して、その中でthisの値を確認します。
function test(){ console.log(this); } test(); //window
結果は、グローバルオブジェクトのwindowがコンソールに表示されます。
次にStrictモードで同様の処理を実行します。
function test(){ 'use strict' console.log(this); } test(); //undefined window.test(); //window
thisの値がundefinedになりました。
関数の呼び出し方をwindowオブジェクトのメソッドとして呼び出すと、thisの値はwindowになります。
applyとcallでthisを指定する
appleとcallを使用すると、thisに設定される値を指定できます。
const Human = function(name, age) { this.name = name; this.age = age; this.hello = function(){ console.log(`Hello, My name is ${this.name}. I am ${this.age} years old.`) } } const human = new Human("Tarou", 20); const human2 = new Human("Zirou", 25) const human3 = new Human("Saburou", 30) human.hello.apply(human2); // Hello, My name is Zirou. I am 25 years old. human.hello.call(human3); // Hello, My name is Saburou. I am 30 years old.
humanからhelloメソッドを呼び出していますが、出力される内容が変わっています。
これは第一引数に指定した値をthisとしてhelloメソッドが動作しているからです。
まとめ
JavaScriptのキーワードのthisを紹介しました。
呼び出し方やStrictモードかどうかによりthisが参照する値が変わります。
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
JavaScriptを学習中の方へ
これで解説は終了です、お疲れさまでした。
- つまずかず「効率的に」学びたい
- 副業や転職後の「現場で使える」知識やスキルを身につけたい
プログラミングを学習していて、このように思ったことはありませんか?
テックアカデミーのフロントエンドコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。
合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、JavaScript・jQueryを使ったWebサービス開発を学べます。
まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。
時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!