推しミネラルウォーターはありますか?

javascriptの初心者です。

サンプルコードを使って勉強しているので、
フラグの使われ方について質問があります。


下にあるコードは、
4枚縦並びになった写真を、ボタンで1枚ずつスライドするスクリプトです。


その中にあるflag変数は、おそらくボタンを2度押しした時に、
一気に2枚スライドをするのを防ぐための、関数使用中を示す変数と思います。


ここで2つ質問です。
●flag変数はここでは、何を表してますか?
●initable関数を抜ける前、後、どちらでスライド動作をしていますか?


----私の考え方(思い込み?)------------

このコードでちゃんと画像がスライドするのですが、
flag = ture とする場所が遅すぎる感じがします。

というのも、
slidetable関数の中に、ifがあるので
その条件がクリアするまで、関数から抜けだせません。
やっと抜けだしてはじめて、flag = trueと設定する。


flag変数が、使用中を表すものだとしたら、
スライド関数に行く前に、flag = tureとして、
「関数は使用中なので、今クリックしてもreturnしますよ」とさせるのでないか?

実際は、どのタイミングで動き出すものかよくわかりません。


chromeでブレークポイントを作って、
1つずつ動かすと、initableを抜けだした後に、
HTMLコードの所に移動したぞ。

この流れだったら、納得するけど。。。

---------------------------
スライド関数の処理は
とりあえずどんな処理をするか受け付ける。(まだ動き出さない)

flag =tureとして、inittable関数を抜けだして

動かす場所に、処理を一気に適用。



---------私の考え方(思い込み?)以上------------






--------------------------------------------
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>東京の風景</title>
<script type="text/javascript">
<!--
var tablemax = 4;
var tablewidth = 260;
var step = 14;
var num = 0;
var offset = 0;
var flag = false;
function inittable(n){
if (flag) return;
num += n;
if (num < 0) { num = 0; return; }
if (num >=tablemax) { num = tablemax-1; return; }
offset = n * step;
count = tablewidth / step;
slidetable();
flag = true;
}
function slidetable(){
imgtables.style.pixelLeft -= offset;
count--;
if (count > 0) setTimeout("slidetable()",10); else flag = false;
}
-->
</script>
</head>
<body>
<img src="left.gif" onMousedown="inittable(-1)" style="position:absolute;top:220px;left:20px;">
<img src="right.gif" onMousedown="inittable(1)" style="position:absolute;top:220px;left:60px;">
<div style="position:absolute;top:10px;left:10px;clip:rect(0px 260px 200px 0px)">
<table id="imgtables" border="0" cellspacing="0" cellpadding="0" style="position:absolute;top:0px;left:0px;">
<tr>
<td>
<table bgColor="#ccccff" width="260">
<tr><td >東京フォト(1)</td></tr>
<tr><td><img src="pic1.jpg" width="260" height="200"></td></tr>
</table>
</td>
<td>
<table bgColor="#ccccff" width="260">
<tr><td>東京フォト(2)</td></tr>
<tr><td><img src="pic2.jpg" width="260" height="200"></td></tr>
</table>
</td>
<td>
<table bgColor="#ccccff" width="260">
<tr><td>東京フォト(3)</td></tr>
<tr><td><img src="pic3.jpg" width="260" height="200"></td></tr>
</table>
</td>
<td>
<table bgColor="#ccccff" width="260">
<tr><td>東京フォト(4)</td></tr>
<tr><td><img src="pic4.jpg" width="260" height="200"></td></tr>
</table>
</td>
</tr>
</table>
</div>
</body>
</html>

A 回答 (1件)

> slidetable関数の中に、ifがあるので


> その条件がクリアするまで、関数から抜けだせません。
> やっと抜けだしてはじめて、flag = trueと設定する。
forやwhileじゃなくてifですよ?

> if (count > 0) setTimeout("slidetable()",10); else flag = false;
countが0より大きければ setTimeout("slidetable()",10); が実行されますが、それだけです。
関数はすぐに抜けます。

> ●flag変数はここでは、何を表してますか?
推測されているとおりビジー(動作中)フラグだと思います。
> ●initable関数を抜ける前、後、どちらでスライド動作をしていますか?
最初の1stepだけは抜ける前。
後は抜けた後。
適当な所にalertでも挿入すれば分かるはず。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!