jQuery でもアロー関数とthisを使いたい
jQuery でアロー関数を書いた時の this の動きに戸惑ったのでそのことについてまとめておきます。「$(this) だと参照できなかったけど、currentTarget 使ったらできたよ!」という内容になります。
jQuery で書く function() {...} とアロー関数の比較
function() {...} とアロー関数の $(this)、 target、currentTarget を比較してみました。
function() {...} 内の $(this)
例えば、jQueryでよく使うclickイベントを使って下記のようなソースコードを書いた場合、$(this) は「イベントが発生した要素(.click の前)」を指します。今回は ".test1" を $(this) として取得できます。
<p class="test1"><a href="">テスト1</a></p>
$(function(){ $('.test1').click(function(event) { console.log($(this)); // e.fn.init [p.test1] console.log($(event.target)); // e.fn.init [a] console.log($(event.currentTarget)); // .fn.init [p.test1] event.preventDefault(); }); });
簡易的ですがデモ用リンクを設置しておきました。ブラウザのコンソールを開きながらクリックすると確認できます。
アロー関数内の $(this)
続いて、アロー関数を使って書いた場合、$(this) は ".test2" ではなく [document] を指しています。アロー関数の場合は「イベントが発生した要素」をとってくれるわけではないみたいです。なので、function() {...} と同じような動きにしたい時は、$(event.currentTarget)を使ったら ".test2" を取得できます。
<p class="test2"><a href="">テスト2</a></p>
$(function(){ $('.test2').click((event) => { console.log($(this)); // e.fn.init [document] console.log($(event.target)); // e.fn.init [a] console.log($(event.currentTarget)); // e.fn.init [p.test2] event.preventDefault(); }); });
簡易的なデモ用リンクその2です。ブラウザのコンソールを開きながらクリックすると確認できます。
target と currentTarget
target は実際にイベントが発生したところを示します。clickイベントであれば、実際にクリックした場所になります。上記の例だと "a" が該当します。
currentTargetはイベントを仕込んでいるところを示します。
おまけ - thisについて簡単にまとめ -
function() { ... } での this
function での this は、基本的に . の前に書いてあるものを指します。なので関数を呼び出す時の [thisになるところ].関数名(); で this が変わってきます。
※bind 使うと動きが変わったり、new は意味合いが違ったり、function を入れ子すると複雑化したりするみたいですがここでは説明しないです。
アロー関数でのthis
宣言した時にthisがどれか決まるので、関数呼び出し時に this が変わってしまうことはないです。
最後に
本当は this についてまとめようと思ったのですが...、私の力量だと説明するには理解不足だったので、今回の記事は素直にやったことをまとめてみました。なのでかなり jQuery に傾いてます。thisについてまとめられなかった代わりに、thisについて調べた時にわりとわかりやすいと感じたものを下記にピックアップしました。
参考記事
- jQueryのイベントをアロー関数で | CodeCode
- e.targetとe.currentTargetの違い | cly7796.net
- e.targetの扱いには注意しよう - Qiita
- event.currentTargetとevent.targetの違い – 1日ひとつ、強くなる。
this を知るのに比較的わかりやすそうだと感じた記事
JavaScriptまだまだな人でも理解しやすそうな記事
JavaScriptについてある程度知っていれば多分わかりやすそうな記事
- JavaScriptのthisについてまとめてみた - Qiita
比較的わかりやすくまとめてある - JavaScript の this を理解する多分一番分かりやすい説明 - Qiita
- JavaScriptのthis(コンテキスト)とは? - Qiita
補足資料
- javascriptでの連想配列の作り方や操作方法まとめ | PisukeCode - Web開発まとめ
連想配列の新しいキーを追加できる仕組みについて - ECMAScript - Wikipedia
ECMAScriptについて - JavaScriptのthisについて – new演算子とコンストラクタ - MANA-DOT
コンストラクタについての解説がわかりやすい