質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

3回答

672閲覧

JavaScriptにおけるthisの挙動が理解できない

yu-i

総合スコア2

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/12 01:29

前提・実現したいこと

JavaScriptにおけるthisの挙動を理解したい。

function A(name) { this.name = name; } A.prototype.logThis = function() { console.log(this); //このthisは何を指すのかが分からない。 } const a = new A('トム'); //コンストラクタ関数Aをインスタンス化 console.log(a); //→実行結果{name: 'トム'} a.logThis(); //→実行結果 {name: 'トム'} const result = a.logThis; result(); //→実行結果 Windowオブジェクト なぜ変数に代入してから実行すると{name: 'トム'}でなくなるのか。

##質問①
なぜconsole.log(a)と、a.logThis()の実行結果が同じ{name: 'トム'}になるのか。
コードのコメント欄に書いているのですが、A.prototype.logThis内のthisが指す内容となぜそれを指すのかが分からないです。

##質問②
定数resultにa.logThisメソッドを代入。
その後、resultを呼び出す。
こうすると実行結果はWindowオブジェクトになります。

なぜa.logThis()のように普通に呼び出したときと、実行結果が異なるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

質問①

a.logThis()のようにメソッドを呼び出した場合、(もともとthisを固定した関数をメソッドとしてセットした場合を除いて)thisは呼び出し元のオブジェクトであるaになります。

質問②
なぜa.logThis()のように普通に呼び出したときと、実行結果が異なるのでしょうか。

JavaScriptのthis呼び出し方によっても変化します。callapplyを使えば、「呼び出し時にthisを自分で設定する」ことすら可能です。

投稿2020/09/12 01:46

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

thisは呼び出され方によって内容が変わります。慣れるまではややこしい、というか、慣れてからもバグを生みやすい、JavaScriptの落とし穴です。

質問①

関数内での this の値は、関数の呼び出され方によって異なります。

関数コンテキスト | this - JavaScript | MDN

 

関数がオブジェクトのメソッドとして呼び出されるとき、その this にはメソッドが呼び出されたオブジェクトが設定されます。

オブジェクトのメソッドとして | this - JavaScript | MDN

質問②

this は既定でグローバルオブジェクトとなり、これはブラウザーでは window です。

単純な呼び出し | this - JavaScript | MDN

投稿2020/09/12 01:46

Lhankor_Mhy

総合スコア36960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答①

なぜconsole.log(a)と、a.logThis()の実行結果が同じ{name: 'トム'}になるのか。
コードのコメント欄に書いているのですが、A.prototype.logThis内のthisが指す内容となぜそれを指すのかが分からないです。

  • 関数コード上で明示的に return 文を使用して返り値を指定していない場合、new 演算子で呼び出された関数は this 値を返す仕様です
  • 関数が new 演算子で呼び出されている場合、コンストラクタ関数としての扱いとなり、prototype プロパティ値を [[Prototype]] とする new Objectthis 値として束縛します
  • a.method() のように関数がメソッド呼び出しされている場合、a.method の関数コード上の this 値は a になります
  • オブジェクトのプロパティが参照される場合、プロトタイプチェーンの原則によって、直属のプロパティが存在しない場合に [[Prototype]] 上のプロパティを参照しようとします

従って、

JavaScript

1function A(name) { this.name = name; } 2A.prototype.logThis = function() { console.log(this); } 3 4const a = new A('トム'); //コンストラクタ関数Aをインスタンス化

変数 aA.prototype.logThis の関数コード内の this 値は同値となります。

回答②

定数resultにa.logThisメソッドを代入。
その後、resultを呼び出す。
こうすると実行結果はWindowオブジェクトになります。

なぜa.logThis()のように普通に呼び出したときと、実行結果が異なるのでしょうか。

関数を静的関数として呼び出す場合、

  • その関数がStrict Modeで実行されているなら、this 値はundefinedになります
  • その関数が非Strict Modeで実行されているなら、this 値はグローバルオブジェクトになります
  • ブラウザ実行環境におけるグローバルオブジェクトはWindowのインスタンスになります

HTML

1<script> 2function foo () { 3 'use strict'; 4 return this; 5} 6function bar () { return this; } 7 8console.log(foo()); // undefined 9console.log(bar()); // Window {parent: Window, opener: null, top: Window, length: 0, frames: Window, …} 10</script>

Re: yu-i さん

投稿2020/09/12 13:26

編集2020/09/12 13:32
think49

総合スコア18189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問