icon
icon

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

新卒入社した会社がブラックな環境で自己研鑽の時間も作れず、これではだめだと思い転職。2度の転職を経て現在3社目。まだまだ挑戦中。
C#, Ruby, Python, JavaScriptなど経験。

JavaScriptのthisについて、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

thisは基本的に呼び出し元のオブジェクトを指すとなんとなく理解している方も多いのではないでしょうか。

実は呼び出し元によってthisの内容が変わりますので、しっかり理解していきましょう。

目次

1時間でできる無料体験!

そもそも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」となっていることから、 コンストラクタで指定した引数の値(インスタンスに設定した値)が表示されていることが分かります。

 

[PR] フロントエンドで副業する学習方法を動画で公開中

厳格モードでの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メソッドが動作しているからです。

 

コラム

コスパとタイパ、両方結果的に良くなる良くなる学び方とは?

「スクールは高いし時間も縛られて効率が悪い」と考える方は多いと思います。
もちろん、時間も費用もかかることは間違いありません。
ただ 結果的に無駄な学びにお金も時間もかける方がリスクが高いという考えもあります。

コスパ・タイパ最適化の参考として、 テックアカデミー卒業生がスクールを選んだ理由 をご紹介します。

  • ・困ったときに、質問や相談できる相手がいるため挫折しなかった
  • ・プロとして必要なスキルのみを深く学べたので無駄がなかった
  • ・副業案件の提供と納品までのサポートがあったので目的を達成できた

安価・短期間で広く浅く学んでも意味がありません。 本当に自分の目的が達成できるか、それが重要です。
自分にどのスキルや学び方が合っているか、どんな学習方法かなど、お気軽に 無料相談 に参加してみませんか?

カウンセラー・現役のプロへ、何でも気軽に無料相談可能。 30分か60分お好きな時間が選べて、かつ3回まで すべて無料で ご利用できます。
無理な勧誘は一切ない ので、お気軽にご参加ください。

今なら相談した方限定の割引・参加特典付き! 無料相談はこちら

まとめ

JavaScriptのキーワードのthisを紹介しました。

呼び出し方やStrictモードかどうかによりthisが参照する値が変わります。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

JavaScriptを学習中の方へ

これで解説は終了です、お疲れさまでした。

  • つまずかず「効率的に」学びたい
  • 副業や転職後の「現場で使える」知識やスキルを身につけたい

プログラミングを学習していて、このように思ったことはありませんか?

テックアカデミーのフロントエンドコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。

合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、JavaScript・jQueryを使ったWebサービス開発を学べます。

まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。

時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

プログラミングを独学で学習していて、このように感じた経験はないでしょうか?

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう カウンセラーやエンジニア・デザイナー があなたの相談に真摯に向き合います。

「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」

こんなささいな悩みでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

今なら参加者限定の割引特典付き! 無料相談を予約する