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となっていくと思っていたので、クロージャはクリックイベント内では、違うのかなと思い調べてみたのですが、よくわからず困っております。
グローバルスコープに変数を定義せずにクロージャを使って「実現したい挙動にする方法」をわかる方がいらっしゃいましたらご教授いただければ幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/09 12:10