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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

解決済

2回答

1168閲覧

Javascript なぜthisを使うのでしょうか?

hitominjar

総合スコア19

JavaScript

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

0グッド

0クリップ

投稿2018/05/22 14:57

初歩的な質問で申し訳ないのですが、どなたかお答えいただければ幸いです。

thisの意味がわからなかったので、調べていたところ
下記の記事にて、貼り付けている通りの記述がありました。
https://qiita.com/takeharu/items/9935ce476a17d6258e27

Javascript

1//メソッド呼び出しパターン 2var myObject = { 3 value: 10, 4 show: function() { 5 console.log(this.value); 6 } 7} 8myObject.show(); // 10

でも下記のような初心者向けの記事には、貼り付けてあるように記述されています。
https://www.sejuku.net/blog/27205

Javascript

1var array = ['apple','banana','lemon','orange']; 2 console.log(array);

varで宣言した変数を、this.valueと書いたり、そのまま変数で書いたりするのはなぜなんでしょうか?

初歩的な質問で申し訳ないのですが、どなたかご回答のほどおねがいします><

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

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

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

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

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

guest

回答2

0

ベストアンサー

例をできるだけ同じ形になるように書きかえてみます。

javascript

1// (1) 2var myObject = { 3 value: 10, 4 show: function() { 5 console.log(this.value); 6 } 7} 8myObject.show(); // 10 9 10// (2) 11var show = function() { 12 var value = 10; 13 console.log(value); 14}; 15show(); // 10

value の位置が(1)と(2)で違うのが分かるでしょうか。
(1) では myObject の中に value というキーがあって、その10 です。
(2) では show の中に value という変数があって、その値が 10 です。

(2)については問題ないと思います。普通の変数の使い方ですね。

(1)についてですが、……そもそも、なんで show の中で value の値が使えるのでしょうか?
だって、show はただの関数ですよね。 value とかいう変数なりキーなりが存在することは、show は全く知らないはずです。
もし「何を言ってるのか分からない」と思われるなら、こう書いたらはっきりするのではないでしょうか。

javascript

1// (1') 2var show_func = function() { 3 console.log(this.value); 4}; 5var myObject = { 6 value: 10, 7 show: show_func 8} 9myObject.show(); // 10 10

show_funcvalue なんて知らないはずです。なのに this を通して myObjectvalue にアクセスできています。
なんで???

……というのが、this を理解するポイントです。

で、this とは何かですが、JavaScript で関数を呼び出すときに何が起きているかを考えればよいです。

javascript

1myObject.show();

JavaScript で myObject.show() という呼び出しをすると、「showthismyObject を束縛(代入)してから show を呼び出す」という動作をします。

この辺、関数呼び出しが実行コードへのただのジャンプであるような他の言語(Cとか)とは違います。間に代入処理が挟まっているんです。

さて、元のコードに戻ります。

javascript

1// (1) 2var myObject = { 3 value: 10, 4 show: function() { 5 console.log(this.value); 6 } 7} 8myObject.show(); // 10

showvalue がなんなのか、全く知りません。でも、this は知っています。自分を呼び出したオブジェクトです。

つまり this.value とは、「自分を呼び出したオブジェクトの value にアクセスする」という意味です。

そしてこの場合、自分(show)を呼び出したのは…… myObject ですね。
なので myObject.value にアクセスできるわけです。

【まとめ】
myObject.showvalue の存在を知らないので、そのままではアクセスできない
② なので this(←これが今の場合は myObject になっている)を介してアクセスする必要がある

……という感じでいかがでしょうか?
分かりづらいかな……。

投稿2018/05/22 16:10

pute

総合スコア134

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

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

hitominjar

2018/05/23 09:11

ありがとうございます!ご丁寧な解説で非常に理解が深まりました! thisを使う意義というのは、より複雑なコードを書く時に、そのほうが都合がいいから?と言う事でしょうか?
pute

2018/05/24 12:07

うーん、そもそも「ローカル変数」とか「javascript における {}の意味」とかは理解されていますか?
hitominjar

2018/05/24 12:42

グーグルで調べた内容ですが、、、下記のような感じと把握してます>< javascript における {}の意味 →オブシェクトの生成 ローカル変数 →Varをつけて変数を宣言してる グローバル変数じゃない
pute

2018/05/24 13:48

{} はそれでいいです。ローカル変数についてもまあいいです。 > より複雑なコードを書く時に、そのほうが都合がいいから? ここの意味がちょっと読み取れませんでした。「都合」ってどういう意味合いで使われているんでしょうか?
退会済みユーザー

退会済みユーザー

2018/05/26 21:36

> thisを使う意義~~ 「myObject.valueと書かずにわざわざthisを使うのはそっちの方が都合がいいからなのか?」という風なことが言いたいのでは・・・?
hitominjar

2018/05/29 10:15

すみません、実際にどういうケースで、thisを用いたコーディングが必要なのかがまだイメージできませんでした>< でもthisを使えば自分を呼び出したオブジェクトの value にアクセスできることはわかりました。
guest

0

実際にどういうケースで、thisを用いたコーディングが必要なのかがまだイメージできませんでした><

↓あえてthisを使わず書いてみました。これはわかりますよね?

js

1var myObject = { 2 value: '俺', 3 show: function() { 4 console.log(myObject.value); 5 } 6} 7var ourObject = { 8 value: '俺たち', 9 show: function() { 10 console.log(ourObject.value); 11 } 12} 13 14myObject.show(); //'俺' 15ourObject.show(); //'俺たち'

よく見ると、showメソッドが同じようなコードなのでまとめて書きたくなりますね。
↓でも、単純に書こうとすると、ちょっと困ります。

js

1var myObject = { 2 value: '俺', 3 show: show, 4} 5var ourObject = { 6 value: '俺たち', 7 show: show, 8} 9 10function show(){ 11 console.log(?????.value); //????? は、myObject の時も ourObject の時もある。 12}

こういう場合どうするか。
↓引数に自分自身を渡せば上手くいきます。

js

1var myObject = { 2 value: '俺', 3 show: show, 4} 5var ourObject = { 6 value: '俺たち', 7 show: show, 8} 9 10function show(who){ 11 console.log(who.value); 12} 13 14myObject.show(myObject); //'俺' 15ourObject.show(ourObject); //'俺たち'

でも、myObjectと2回書くのはだるいですね。
これが、2つだからまだいいですが、増えてくるとこうなります。

js

1var myObject = { 2 value: '俺', 3 show: show, 4} 5var ourObject = { 6 value: '俺たち', 7 show: show, 8} 9//... 10 11function show(who){ 12 console.log(who.value); 13} 14 15myObject.show(myObject); //'俺' 16ourObject.show(ourObject); //'俺たち' 17yourObject.show(ourObject); //'お前ら' 18hisObject.show(hisObject); //'彼' 19herObject.show(herObject); //'彼女'

コピペで書くにしても、何かしら間違えそうです。
(ちなみに、1か所わざと間違えているところがありますが、気づきました?)

自分自身を参照できる書き方があれば楽ですよね。
↓たとえば、こんな感じで。

js

1var myObject = { 2 value: '俺', 3 show: show, 4} 5var ourObject = { 6 value: '俺たち', 7 show: show, 8} 9//... 10 11function show(){ 12 console.log(this.value); // this 13} 14 15myObject.show(); //'俺' 16ourObject.show(); //'俺たち' 17yourObject.show(); //'お前ら' 18hisObject.show(); //'彼' 19herObject.show(); //'彼女'

投稿2018/05/29 11:00

Lhankor_Mhy

総合スコア36074

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

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

hitominjar

2018/05/29 11:08

今ハッキリと理解できました!!ご丁寧にありがとうございます><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問