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

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

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

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

Q&A

2回答

1134閲覧

javascript このthisは一体?

kirokira

総合スコア13

JavaScript

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

0グッド

1クリップ

投稿2019/02/15 16:35

<div class="container"> <div id="myImages" class="gallery"> <ol> <li data-image="img1"> <img src="" alt=""> </li> <li data-image="img2"> <img src="" alt=""> </li> <li data-image="img3"> <img src="" alt=""> </li> </ol> </div> </div> <script type="text/javascript"> function test(root) { const images = root.querySelectorAll('[data-image]'); function onClickImage () { console.log(this); } images.forEach(i => { i.addEventListener('click', onClickImage); }); } const elem = document.getElementById('myImages'); test(elem); </script>

上記のようなコードがあったとしてメソッドonClickImageでthisをconsoleで吐いているのですが、結果は

<li data-image="img1"><img src="" alt=""></li>

になります。このthisはグローバルオブジェクトではないということでしょうか?
なぜこのthisがこういった結果になるか、教えていただけませんでしょうか?
よろしくお願い致します。

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/02/15 20:22

まずは基本↓ JavaScript の this を理解する多分一番分かりやすい説明 - Qiita https://qiita.com/takkyun/items/c6e2f2cf25327299cf03 ただイベントリスナーの呼び出しはユーザーがするわけではないのでコードがなく、.の前は何だったんだ!?となりますが、普通にイベントを受けたオブジェクトになるようです。
kirokira

2019/02/16 03:08

こちらのURLを拝見させて頂きました。ありがとうございます。 ただ一つわからないのは ``` test(elem); ``` としていて.の前になにも指定していないのでwindowオブジェクト?になるのではないかな?と思った次第です。wwbQzhMkhhgEmhUさんがおっしゃっている普通にイベントを受けたオブジェクトとは forEachで回した変数iという認識でよろしいでしょうか?
wwbQzhMkhhgEmhU

2019/02/16 03:56

testの中では、各LI要素のclickイベントに対して、onClickImageをイベントハンドラとして登録しているだけです。実際にLI要素がクリックされたときにonClickImageが呼ばれます。この呼び出しはユーザーコードではなく、ブラウザが呼び出しているわけですから、.の前に何がついているか分かりませんよね? しかし、通常の想定通り、LI要素オブジェクトが.の前についているのと同じ挙動をする、ということです。 ただ、このタイミングでのthisは昔からバグりやすいと言われているので、私も使ったことはないです。
wwbQzhMkhhgEmhU

2019/02/16 04:01

あ、まともな回答ついてましたね。 think49さんの方の回答を参考にしてください。
guest

回答2

0

addEventListenerとコールバック関数

コールバック関数 内の this 値はコールバック関数を呼び出している関数側で制御されている場合があります。
つまり、addEventListenerの仕様を調べて下さい。

呼び出し方によって例外はありますが、基本的には、event.currentTarget と等価という認識で良いと思います。

JavaScript

1event.currentTarget === this

Strict Mode

このthisはグローバルオブジェクトではないということでしょうか?

関数呼び出しした際の規定値として、グローバルオブジェクトと認識されているようですが、Strict Modeでは undefined になります。

Re: kirokira さん

投稿2019/02/16 03:19

think49

総合スコア18162

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

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

0

グローバルオブジェクトをどのようなイメージで使われているのか今一つわかりませんが、
thisはイベントが発生した自身をさしています。
複数同じfunctionを呼び出すようにされているようなので、今は最初の要素をクリックした結果<li data-image="img1"><img src="" alt=""></li>が出ているだけで、クリックする要素によって出力内容がそのクリックした要素に変わるはずです。

投稿2019/02/15 21:14

m.ts10806

総合スコア80850

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

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

kirokira

2019/02/16 03:04

<li data-image="img1"><img src="" alt=""></li> もオブジェクトの一つということでしょうか?
think49

2019/02/16 03:27

> グローバルオブジェクトをどのようなイメージで使われているのか グローバルオブジェクトは、グローバル変数名のプロパティを持つオブジェクトを指し、Webブラウザにおいては window で参照できます。 質問者が示唆しているのは、おそらく、関数を静的呼び出しした際の this 値の既定値で <script>(function () { console.log(this); }());</script> だと思います。
think49

2019/02/16 03:58

> thisはイベントが発生した自身をさしています。 細かいことですが、個人的には「イベントが発生した要素ノード = event.target」「イベントを定義した要素ノード = event.currentTarget (= this)」 の認識ですね…。
m.ts10806

2019/02/16 05:08

確かにそうですね。補足ありがとうございます。 質問者さん すごく厳密には違いますが、(jQueryでは$(element名)で取得するので)方向性はそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問