• ベストアンサー

フラグについて

 javascript初心者です。  タイマー作成などで使われる、「フラグ」ですが、よくわかりません。 myButton = 0; function myCheck(myFlg){ if (myButton==0){ myStart=new Date(); myButton = 1; document.myForm.myFormButton.value = "Stop!"; myInterval=setInterval("myCheck(1)",1); }else{ if (myFlg==0){ myButton = 0; document.myForm.myFormButton.value = "Start"; clearInterval( myInterval ); }     ・     ・      ・   ・・・onclick="myCheck(0)"> なぜ、『myButton = 0;』のフラグと『myCheck(myFlg)』のフラグが2つ必要なのでしょうか?1つじゃできないんでしょうか? と、レベルの低い質問ですが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

function hoge() { alert( 'abc' );} と var hoge = function ( ) { alert( 'abc' ); }; は、ほぼ同じとうのは理解した? function hoge() { alert( 'abc' );} は、関数 hoge の定義文。 関数 hoge には、{ alert( 'abc' );}のプログラムが代入されている。 このプログラムを実行するには、関数の名前のあとに () をつける。 今回の場合は、 hoge(); 定義と実行は違う。

jitsjp_spt
質問者

補足

 本当に迅速で明快な回答ありがとうございます。  わかりました。感謝いたします。  馬鹿な質問で本当に申し訳ありません。    で、前出の質問ですが、 『 if(myButton == 0)』のフラグは(『 if( myButton == 1)』になると勝手に思い込んでいる)『if (myFlg==0)』にすり替わっちゃっているのはどのように結び付けたらよいのでしょうか? よろしくお願いいたします。

その他の回答 (7)

回答No.8

myInterval = setInterval( "myCheck(1)", 1 ); これが実行されると、0.001秒後とに myCheck(1)が呼び出されるようになるだけです myCheck(0);が呼ばれるまで、繰り返したいのかもしれませんが・・・・ つまりどこかで myCheck(0)がよばれると、停止する。 正直なところ、このコードは、なんの参考にもならないと思う。 ちょっと気になるのだが。もしかして setInterval()とsetTimeout()を混同していないか?

jitsjp_spt
質問者

お礼

返事が遅くなりまして、申し訳ございませんでした。  たしかに、setInterval()とsetTimeout()を良く理解していなかったようです。違いをしらみつぶしに調べてみます。   お見受けしたところ、いままでいろいろ質問して、いろいろな方からの回答をもらって、お礼として回答者側にまわって恩返しされているとのこと。  大変感銘いたしました。自分もそうできればよいのですが、技術が伴っておりません。  babu_baboo様の域に達したらそうしたいと思っております。  今回の問答集はすべてコピーして大切に保存してまいりたいとおもっております。ほんとうにばかな質問に親切、丁寧にお答えいただきありがとうございました。  ちなみにbabu_baboo様はjavascriptなど関連のHPなどは開設しているんでしょうか?  重ね重ねほんとうにありがとうございました。    

回答No.7

var myButton = 0; var myInterval; function myCheck( myFlg ) {  if( myButton == 0 ) {   var myStart = new Date();   myButton = 1;   document.forms['myForm'].elements['myFormButton'].value = "Stop!";   myInterval = setInterval( "myCheck(1)", 1 );  } else {   if( myFlg == 0 ) {    myButton = 0;    document.forms['myForm'].elements['myFormButton'].value = "Start";    clearInterval( myInterval );   }  } } //上のコードは、変数名をちょっと下のよう変えて考える //myFlg は、フラッグではなく、モードと考える //myButton のみが、本来のフラッグと考える var myBtnFlag = 0; var myInterval; function myCheck( myMode ) {  if( myBtnFlag == 0 ) {   var myStart = new Date();   myBtnFlag = 1;   document.forms['myForm'].elements['myFormButton'].value = "Stop!";   myInterval = setInterval( "myCheck(1)", 1 );  } else {   if( myMode == 0 ) {    myBtnFlag = 0;    document.forms['myForm'].elements['myFormButton'].value = "Start";    clearInterval( myInterval );   }  } }

jitsjp_spt
質問者

補足

 たしかに見方を変えれば・・・。納得しました。  『myFlg は、フラッグではなく、モードと考える』というのがミソですね。  さすがに謙遜されていますが、熟達者さんでございます。    質問攻めで、腹が立ったらすいませんが。  onclickして、myCheckがゼロだったら、myModeがゼロ・・・ だったら、タイマーが停止する気がするのですが。  setInterval("myCheck(1)",1);の「1」によってでしょうか?  でも、if(myMode == 0){ で動いているのに、setInterval("myCheck(1)",1);に行くのか??? うーん・・・。  すいません。怒らないでくださいませ。ご教授願いますでしょうか?  

回答No.5

function fuga ( ) {  var hoge = function ( ) {   alert( 'abc' );  };    return hoge; } //上は下のようにもできます。いきなり下のように書きたかったのだけど //ワンクッションおいて、変数に代入したほうが、理解しやすいと思ったのが裏目だった? function fuga ( ) {  return function ( ) {   alert( 'abc' );  }; } 変数には、数値や文字列、関数、オブジェクトなどを代入できます var hoge = new Object( ); // var hoge = { }; 実は、関数もオブジェクトのようなもの。 なので、代入文で関数を定義できます つまり、 function hoge( ) {  alert( 'abc' ); } は、 var hoge = function ( ) {  alert( 'abc' ); }; と、ほぼ同じ。 //_________ hoge(); function hoge( ) { alert( 'abc' ); } //上の2行のプログラムは、エラーにならないけど //下の2行はエラーになる //なぜかというと、まだhogeが定義される前に、それを実行しようとしたから hoge(); var hoge = function ( ) { alert( 'abc' ); }; //「初心者」×2って連呼しなくても・・・ // 俺も、それに近いからね ^^;

jitsjp_spt
質問者

補足

毎度、毎度のご回答ありがとうございます。 ぜんぜんbabu_baboo様は初心者などではありません ちなみに、蟻地獄にはまってしいました。 hoge(); function hoge() { alert( 'abc' );} にhoge();をつけるとなんでalertのメッセージボックスが表示されるのかわからなくなってしまいましたです・・・ ばかですみません・・・。

回答No.4

こういうのだったらどう? // まず、丈夫なプログラムを作ること。 // それには、グローバル変数を極力使わないこと // つまり、他から影響を受けないようにする myButton = 0; // これには、 var がないけどグローバル。 //この変数を、関数の中に閉じ込められれば、よい。 //まず下を参照 //'abc'をアラーとする関数 function hoge( ) {  alert( 'abc' ); } //上の関数そのものを返す関数 function fuga ( ) {  var hoge = function ( ) {   alert( 'abc' );  };    return hoge; } //上の関数を、指定した文字列が返えるようにする function fuga ( str ) {  var hoge = function ( ) {   alert( str );  };    return hoge; } //上の関数を、 var hoge = fuga('abc'); // として実行すると、以後'abc'は必要なく、hoge(); と呼び出すだけで // 変数 str の値は維持される。ということは、その変数が関数の中で // 生きているということ。これを flag に使えば、グローバル変数を // 使わなくてすむ。 function fuga ( str ) {  var flag = false;  var hoge = function ( ) {   alert( [ str, flag ] );   flag = ! flag; //flagを反転  };    return hoge; }

jitsjp_spt
質問者

補足

すいません。 初心者なので、わからないところが・・・ 変数に関数を代入する function fuga ( ) {  var hoge = function ( ) {   alert( 'abc' );  };    return hoge; } ところがわからないのですが? ご教授ねがいますでしょうか?

  • nobuoka
  • ベストアンサー率69% (23/33)
回答No.3

もし JavaScript を基礎からしっかりと学ぶ必要がある / 学びたいのであれば Shelley Powers 著、武舎広幸・武舎るみ 訳 『初めての JavaScript 第 2 版』 (ISBN: 978-4873114255) という書籍がおすすめです。 趣味で軽く JavaScript の勉強をしたい、というのならソースコードのサンプル集みたいなのがいいかもしれませんが、私はそういうのには詳しくないのでちょっとわかりません。。 まあ趣味程度であればネット上のサンプルをちょこちょこいじってみるのが手間もかからず楽しいかなーと思います。

jitsjp_spt
質問者

お礼

 大変ご親切な回答ありがとうございました。  感謝いたします。

回答No.2

こういうのだったら、どうでしょう? 1みりびょうでよびだしている意味がわからないので、指定みり秒後にかいじょ。 (たたかれ台に!(Mではありません。^^;)ぜんかくくうはくは、はんかくに!) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>TEST</title> <body> <form action="#"> <p><input type="button" value="start" id="a" onclick="hoge()"></p> <p><input type="button" value="start" id="b" onclick="fuga()"></p> </form> <script type="text/javascript"> function myChecker ( e, time, flag, str_false, str_true ) {  var v_str_false = 'string' === typeof str_false ? str_false: e.value;  var v_str_true = 'string' === typeof str_true ? str_true: e.value;  flag ? _on(): _off();  return function ( ) {   return flag || _on();  };  function _on ( ) {   e.value = v_str_true;   flag = true;   return setTimeout( _off, time );  }    function _off ( ) {   e.value = v_str_false;   return flag = false;  } } var hoge = myChecker( document.getElementById('a'), 2000, false, 'Start', '( . Y . )'); var fuga = myChecker( document.getElementById('b'), 5000, false, 'Start', '( . Y . )'); </script>

jitsjp_spt
質問者

お礼

 ご回答ありがとうございます。  初心者の私にはちょっと難しかったのですが、理解してみたいと思います。

  • nobuoka
  • ベストアンサー率69% (23/33)
回答No.1

プログラミングにおける 「フラグ」 というのは、現在の状態を保持する変数などのことをいいます。 質問で提示されているプログラム中において、  myButton という変数は、「タイマーが動いているかどうか」 という状態を保持するための変数 (つまりフラグ) です。 一方で、  myCheck(myFlg) の myFlg というのは仮引数変数であり、単にメソッドの引数の名前でしかありません。 つまり、これはフラグとはいえないと思います。 ただ jitsjp_spt さんの疑問ももっともで、何故わざわざ myCheck メソッドに引数を渡しているのかよくわかりません。 このコードをどこで見かけられたのかわかりませんが、全体的にあまり良いコードではありませんし、参考にされない方が良いと思います。

jitsjp_spt
質問者

補足

 心強い回答ありがとうございます。  相当悩んでしまいました。  javascriptについて、参考になるサイトや書籍などご存知でしたら おしえていただけると幸いです。  よろしくお願いいたします。

関連するQ&A

  • javascriptに関しまして

    javascriptに関しまして if文の処理に関してお聞きしたいことがあります。 <script language="JavaScript"> <!-- myFlg = 0; function myFunc(){ if(myFlg == 0){ document.myFormMeS.value = "こんにちは"; } myflg = 1; else{ document.myFormMeS.value = ""; myFlg == 0; } } //--> </script> <form name="myform"> <input type="text" size="20" name="myFormMeS"> <script language="JavaScript"> <!-- setInterval("myFunc()",500); // --> </script> </form> というサンプルコードの中で、フラグの管理をする際に 初期値として、myFlg = 0をセットしているのでこんにちはと 表示してからmyFlg に1を代入していますが、その後一度if文を抜けて、 もう一度if(myFlg == 0)の判定を行っているのでしょうか? それとも、そのままelse処理に進むのでしょうか・・・? if文を抜けた後にどこの判定に進むのかいまいちよく分かりません。 初歩的な質問になりますが、宜しくお願い致します。

  • このJavaScriptはなんか早い・・・

    <html> <head> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 6.5.0.0 for Windows"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE>タイマー</TITLE> </head> <body> <script language="JavaScript"><!-- myCnt = 0; myTim = 0; function myGo(){ mySelect = document.myForm.myMenu.selectedIndex; myCnt = eval(document.myForm.myMenu.options[mySelect].value); myTim = setInterval("myTimer()",1000); } function myTimer(){ myCnt = myCnt-1; document.myForm.myFormSec.value = myCnt + " 秒"; if (myCnt == 0){ clearInterval(myTim); alert("制限時間を終了しました。"); } } // --></script> <CENTER> <form name="myForm"><select name="myMenu" size="1"> <option value="180">時間制限は? </option> <option value="600">10分 </option> <option value="300">5分 </option> </select> <input type="button" value="GO!" onclick="myGo()">                            あと<input type="text" size="15" name="myFormSec"> です。</form> </CENTER> <form> <center><input type="button" value="閉じる" onclick="window.close()"> </center> </form> </body> </html> 上のものを実行させると、なぜかスピードが早くなってしまいます。 どうすればいいのでしょう。 お願いします。

  • おかしいところ

    どこがおかしいか教えてください。 <html> <head> <title>タイマー</title> <script languge="javascript"> <!-- function timer1(){ index = document.from.timeSelect.selectedIndex; remain = document.from.timeSelect.options[index].value; document.from.remain.value = remain; timerID= setInterval("timer2()",1000); } function timer2(){ document.from.remain.value -=1; if (document.from.remain.value <=0) { clearInterval(timerID); alert("時間です!"); } } //--> </sccript> </head> <body> <font size="5">タイマー</font> <br> 時間を決めてください<br> <from name="from"> <select name-"timeSelect"> <option value="300">5分</option> <option value="240">4分</option> <option value="180">3分</option> <option value="120">2分</option> <option value="60">1分</option> </select> <input type="button" value="タイマースタート!" onClick="timer1()"><br> あと<input type="text" value="0" name="remain">秒です </from> </body> </html>

  • ノベルゲームを FLASH AS2 で作りたいです

    ノベルゲームを FLASH AS2 で作りたいです しかし、文章をクリックして表示することはできたのですが、「男が現れた」など画像を途中から読み込みたいです。 文章再生してる途中 myData[2] からフレームを跳んで、画像などを表示させたいのですが、どうすれば途中から跳んでくれるのかわかりません。 助けていただけていただけないでしょうか? アクションはこんな感じです。 var myData = new Array(); myData[0] = "…………………………。"; myData[1] = "こんにちは"; myData[2] ="男が現れた"; var spd = 40; var n = 0; var cnt = 0; myButton._visible = true; function myFunc() { cnt++; myField.text = myData[n].substr(0, cnt); updateAfterEvent(); if (cnt>=myData[n].length) { myButton._visible = true; clearInterval(myID); } } myID = setInterval(myFunc, spd); myButton.onRelease = function() { if (n<myData.length-1) { n++; } else { n = 0; } cnt = 0; myID = setInterval(myFunc, spd); myButton._visible = true; };

    • ベストアンサー
    • Flash
  • クリック→テキストボックスに追加

    下記は、クリックすると、テキストボックスの文字が入れ代わります。こうでなく、「どれどれそれからどうした」と追加していくようにするにはどうしたらよいでしょうか? <A HREF="javascript:function voi(){};voi()" onClick="document.myform.bun.value='どれどれ'">どれどれ</A><BR> <A HREF="javascript:function voi(){};voi()" onClick="document.myform.bun.value='それから'">それから</A><BR> <A HREF="javascript:function voi(){};voi()" onClick="document.myform.bun.value='どうした'">どうした</A><BR> <FORM name="myform"> <INPUT TYPE="TEXT" NAME="bun" SIZE="50"> </form>

  • javascript iframeについて

    iframeにてアンケート的な物を作成しています。 ページは13ページくらいです ボタンを押すと次のページに移動し、さらに親のテキストエリアに選択したボタンの文言が上から保存されていくようにしたいのですが ↓は子のiframe内ですが、どのようにしていいかわからなくて、、 <html> <head> <link href="./if.css" rel="stylesheet" type="text/css"> </head> しつもん1<br><br> <form name="test"> <input type="button" name="001" value="戸館"onClick="kakunin(1)";onClick="setChars('AAAA')")><br><br> <input type="button" name="002" value="集合住宅" onClick="kakunin(2)"> </form> <form name="myFORM"> <textarea name="myTEXT"rows="10"></textarea><br> <!-- ↓ ここから先はJavaScript!!! --!> <script type="Text/Javascript"> function setChars(text) { if (document.myFORM.myTEXT.value || "") { document.myFORM.myTEXT.value = document.myFORM.myTEXT.value + "\n" } document.myFORM.myTEXT.value = document.myFORM.myTEXT.value + text } function kakunin(btnNo){ if (btnNo == 1){ link = "戸館"; href = "EN002.html"; }else{ link = "集合住宅"; href = "EN002m.html"; } ret = confirm(link + "でよろしいですか?"); if (ret == true){ location.href = href; } } </script> </html> よろしくお願いいします。

  • JavascriptのtimerIDの意味

    いつもお世話になっております。 現在、Javascriptの勉強をしており、その過程でカウントダウンタイマーを作成しています。 テキスト通りにsetTimeout()メソッドなどを使用しているのですが、timerIDの意味が理解できず困っております。 タイマーを識別するID番号ということはなんとなく理解できるのですが、下記コードのelse if (timerID)やtimerID=0とは何を意味しているのでしょうか。 if文の条件がtimerIDとはどういうことなのか。 timerIDの値を0にする必要性は何なのか。 教えてください。 <doctype! html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Javascript</title> <script type="text/javascript"> window.onload = init; function init(){ document.form1.start.onclick = start; document.form1.reset.onclick = stop; } var timerID; function start(){ count = parseInt(document.form1.time.value); if (count<=0){ count = 0; return; } else if (timerID){ count--; } document.form1.time.value=count; if (count==0){ clearTimeout(timerID); timerID = 0; alert("時間です"); return; } timerID = setTimeout("start()", 1000); } function stop(){ document.form1.time.value=0; if(timerID){ clearTimeout(timerID); timerID=0; } } </script> </head> <body> <h1>カウントダウンタイマー</h1> <form name="form1"> 時間<input name="time" type="text" size="3">秒<br> <input name="start" type="button" value="スタート"> <input name="reset" type="button" value="リセット"> </form> <script type="text/javascript"> </script> </body> </html>

  • セレクトボックスで選択した内容をテキストボックスへ

    こんにちは、初めて質問させて頂きます。 現在、下記のような形式で、選んだテキストをテキストボックスに追加する仕様を使っています。 これをテキストではなく、プルダウン形式のセレクトボックスで選択できるようにはできないでしょうか? <A HREF="javascript:function voi(){};voi()" onClick="document.myform.comment.value+='鉄 '">鉄</A><BR> <A HREF="javascript:function voi(){};voi()" onClick="document.myform.comment.value+='アルミ '">アルミ</A><BR> <A HREF="javascript:function voi(){};voi()" onClick="document.myform.comment.value+='塩ビ '">塩ビ</A><BR> <FORM name="myform"> <INPUT TYPE="TEXT" NAME="comment" SIZE="50"> </form> お手数ですが、もし宜しければお知恵をお貸し下さい。

  • Javascript ポップアップウィンドウでのデータの受け渡し

    よくある○○度チェックみたいなものを作っているのですが、 項目が10個程あって、 「チェックが0個~4個のあなたは、△△△!!」 「チェックが5個~7個のあなたは、◇◇◇!!」 「チェックが8個~10個のあなたは、◎◎◎!!」 という流れなのです。 で、その3パターンの結果ごとに異なる HTMLをポップアップウィンドウで表示させたいのです。 たいていは次のページに結果を表示させるパターンですが、ここをポップアップ表示させたいのです。 しかも3つそれぞれのHTMLに。 <script language="JavaScript"> function myCheck(){ myCnt=0 // チェックした数 for (i=0; i<document.myForm.length-1; i++){ // チェックボックスの数分ループ if (document.myForm.elements[i].checked == true){ // チェックはオンか? myCnt++ // チェック数 加算 } } if ( myCnt <= 3 ){ // チェックは 無し(ゼロ) myUrl = "check_1.html"; } else if ( myCnt <= 5 ){ // チェックは 1以上6以下 myUrl = "check_2.html"; } else if ( myCnt > 5 ){ // チェックは 1以上6以下 myUrl = "check_3.html"; } funMsgUrl(myUrl) } function funMsgUrl(url){ location.href = url } </script>  ・  ・  ・ <form name="myForm"> <input name="checkbox1" type="checkbox">項目<br> <input name="checkbox2" type="checkbox">項目<br> <input name="checkbox3" type="checkbox">項目<br>  ・  ・  ・ <input name="checkbox9" type="checkbox">項目<br> <input name="checkbox10" type="checkbox">項目<br> </form> <input type="button" onClick="myCheck(); return false;" value="チェック"> すみませんが、助言をお願いいたします。

  • 代入の基礎?

    あけましておめでとうございます。 下記は「n」の値によって年月日の値を変更しようとしています。n=2の時は今日の日付を入れます。これはOK。それ以外の時は「最初に年月日のフォームに表示された値」を「mydate」に代入したものを表示したいのですが、下記だと直前に年月日に表示されたものになってしまうようです。基本的なこととは思いますが、助言いただけないでしょうか。 function set( n ) { mydate = document.myFORM.年月日.value if(n == 2) {document.myFORM.年月日.value = "今日の日付を入れる"}; else {document.myFORM.年月日.value = mydate} }

専門家に質問してみよう