<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がこういった結果になるか、教えていただけませんでしょうか?
よろしくお願い致します。
まずは基本↓
JavaScript の this を理解する多分一番分かりやすい説明 - Qiita
https://qiita.com/takkyun/items/c6e2f2cf25327299cf03
ただイベントリスナーの呼び出しはユーザーがするわけではないのでコードがなく、.の前は何だったんだ!?となりますが、普通にイベントを受けたオブジェクトになるようです。
こちらのURLを拝見させて頂きました。ありがとうございます。
ただ一つわからないのは
```
test(elem);
```
としていて.の前になにも指定していないのでwindowオブジェクト?になるのではないかな?と思った次第です。wwbQzhMkhhgEmhUさんがおっしゃっている普通にイベントを受けたオブジェクトとは
forEachで回した変数iという認識でよろしいでしょうか?
testの中では、各LI要素のclickイベントに対して、onClickImageをイベントハンドラとして登録しているだけです。実際にLI要素がクリックされたときにonClickImageが呼ばれます。この呼び出しはユーザーコードではなく、ブラウザが呼び出しているわけですから、.の前に何がついているか分かりませんよね?
しかし、通常の想定通り、LI要素オブジェクトが.の前についているのと同じ挙動をする、ということです。
ただ、このタイミングでのthisは昔からバグりやすいと言われているので、私も使ったことはないです。
あ、まともな回答ついてましたね。
think49さんの方の回答を参考にしてください。