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

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

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

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

1回答

1236閲覧

クロージャをクリックイベント内で使いたい。

knight1220

総合スコア23

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/02/07 22:53

編集2021/02/09 12:18

html

1<div class="table_case"> 2 <div class="table table1"></div> 3 <div class="table table2"></div> 4 <div class="table table3"></div> 5</div>

jQuery

1var clickLog=[]; 2 3$(document).on('click','.table',function(){ 4 var click=$(this); 5 clickLog.push( click ); 6 LogLen=Log.length; 7 if( LogLen>1 ){ 8 if( clickLog[ (LogLen-2) ] === clickLog[ (LogLen-1) ] ){ 9 console.log('一致'); 10 }else{ 11 console.log('不一致'); 12 } 13 } 14});

tableをクリックした際にclickLogにどのtableをクリックしたかを追加していき、一回前にクリックしたtableと今クリックしたtableが同じものであるかを判別するために上記のコードを作りました。
上記のコードで実現したい動作は得られるのですが、グローバルスコープに変数を定義しているのでクロージャを使いたいと思っているのですが、やり方がわからずに困っております。

クロージャについては調べたのですが、思い通りの動作ができなかったので、試しに、参考にさせていただいたサイトのコードを実行してみました。
すると、グローバルスコープでクロージャのdemoコードを実行すると説明通りクロージャの動作をするのですが、クリックイベント内で同じコード実行するとうまく機能しませんでした。
クリックイベント内では違う挙動をするものなのでしょうか?
以下は参考にさせていただいたクロージャのコードです。

jQuery

1var createTimer = function () { 2 var time = 10; 3 4 return function timeDown() { 5 time -= 1; 6 console.log(time); 7 }; 8 }; 9 10//グローバル変数にセットされたことで、クロージャになる 11var timer = createTimer(); 12timer(); // 「9」 13timer(); // 「8」 14timer(); // 「7」

上記のコードを試しにクリックイベント内に記述すると、

jQuery

1$(document).on('click','.table',function(){ 2var createTimer = function () { 3 var time = 10; 4 5 return function timeDown() { 6 time -= 1; 7 console.log(time); 8 }; 9 }; 10 11var timer = createTimer(); 12timer(); // 「9」 13 14});

となりました。
イメージではクリックするごとにtimeが9,8,7となっていくと思っていたので、クロージャはクリックイベント内では、違うのかなと思い調べてみたのですが、よくわからず困っております。
グローバルスコープに変数を定義せずにクロージャを使って「実現したい挙動にする方法」をわかる方がいらっしゃいましたらご教授いただければ幸いです。

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

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

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

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

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

guest

回答1

0

イメージではクリックするごとにtimeが9,8,7となっていく

そうなっています

投稿2021/02/08 00:23

yambejp

総合スコア115010

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

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

knight1220

2021/02/09 12:10

お早い返信ありがとうございます。 返信が遅くなってしまい大変申し訳ございません。 最後のコードに誤りがありましたので修正しました。 クリックイベント内にあるときにクリックするごとに9,8,7となっていくようにしたいと思っているのですが、今のままでは、クリックするごとに9→クリック→9→クリック→9…となってしまうということが説明したかったのですが、説明が下手くそで申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問