アプリ版:「スタンプのみでお礼する」機能のリリースについて

 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つじゃできないんでしょうか?
と、レベルの低い質問ですが、よろしくお願いいたします。

A 回答 (8件)

function hoge() { alert( 'abc' );}



var hoge = function ( ) { alert( 'abc' ); };
は、ほぼ同じとうのは理解した?


function hoge() { alert( 'abc' );}
は、関数 hoge の定義文。

関数 hoge には、{ alert( 'abc' );}のプログラムが代入されている。
このプログラムを実行するには、関数の名前のあとに () をつける。
今回の場合は、
hoge();

定義と実行は違う。

この回答への補足

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

補足日時:2010/02/26 19:44
    • good
    • 0

myInterval = setInterval( "myCheck(1)", 1 );


これが実行されると、0.001秒後とに myCheck(1)が呼び出されるようになるだけです

myCheck(0);が呼ばれるまで、繰り返したいのかもしれませんが・・・・
つまりどこかで myCheck(0)がよばれると、停止する。


正直なところ、このコードは、なんの参考にもならないと思う。



ちょっと気になるのだが。もしかして
setInterval()とsetTimeout()を混同していないか?
    • good
    • 0
この回答へのお礼

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

 

お礼日時:2010/02/28 15:33

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 );
  }
 }
}

この回答への補足

 たしかに見方を変えれば・・・。納得しました。
 『myFlg は、フラッグではなく、モードと考える』というのがミソですね。
 さすがに謙遜されていますが、熟達者さんでございます。
 
 質問攻めで、腹が立ったらすいませんが。

 onclickして、myCheckがゼロだったら、myModeがゼロ・・・
だったら、タイマーが停止する気がするのですが。
 setInterval("myCheck(1)",1);の「1」によってでしょうか?
 でも、if(myMode == 0){ で動いているのに、setInterval("myCheck(1)",1);に行くのか??? うーん・・・。
 すいません。怒らないでくださいませ。ご教授願いますでしょうか?
 

補足日時:2010/02/27 11:26
    • good
    • 0

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って連呼しなくても・・・
// 俺も、それに近いからね ^^;

この回答への補足

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

補足日時:2010/02/26 15:23
    • good
    • 0

こういうのだったらどう?



// まず、丈夫なプログラムを作ること。
// それには、グローバル変数を極力使わないこと
// つまり、他から影響を受けないようにする
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;
}

この回答への補足

すいません。
初心者なので、わからないところが・・・
変数に関数を代入する


function fuga ( ) {
 var hoge = function ( ) {
  alert( 'abc' );
 };
 
 return hoge;
}
ところがわからないのですが?
ご教授ねがいますでしょうか?

補足日時:2010/02/26 00:36
    • good
    • 0

もし JavaScript を基礎からしっかりと学ぶ必要がある / 学びたいのであれば Shelley Powers 著、武舎広幸・武舎るみ 訳 『初めての JavaScript 第 2 版』 (ISBN: 978-4873114255) という書籍がおすすめです。



趣味で軽く JavaScript の勉強をしたい、というのならソースコードのサンプル集みたいなのがいいかもしれませんが、私はそういうのには詳しくないのでちょっとわかりません。。 まあ趣味程度であればネット上のサンプルをちょこちょこいじってみるのが手間もかからず楽しいかなーと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/26 00:48

こういうのだったら、どうでしょう?


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>
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/23 21:57

プログラミングにおける 「フラグ」 というのは、現在の状態を保持する変数などのことをいいます。

質問で提示されているプログラム中において、
 myButton
という変数は、「タイマーが動いているかどうか」 という状態を保持するための変数 (つまりフラグ) です。

一方で、
 myCheck(myFlg)
の myFlg というのは仮引数変数であり、単にメソッドの引数の名前でしかありません。 つまり、これはフラグとはいえないと思います。

ただ jitsjp_spt さんの疑問ももっともで、何故わざわざ myCheck メソッドに引数を渡しているのかよくわかりません。 このコードをどこで見かけられたのかわかりませんが、全体的にあまり良いコードではありませんし、参考にされない方が良いと思います。

この回答への補足

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

補足日時:2010/02/23 21:50
    • good
    • 0

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