• ベストアンサー

javascript 初心者です 引数と変数について

下記のスクリプトで○と×交互に表示されるようにしたいのですが、 hensu = !hensu;のところがうまく機能してくれません。 i = !i;だとうまくいくのですが、引数を使いたいです。 どのように記述すればよいのでしょうか? よろしくお願いします。 <html> <head> <script type="text/javascript"> <!-- i = true; function myFunc(hensu){ if(hensu){ alert("○"); } else{ alert("×"); } hensu = !hensu; } --> </script> </head> <body> <p onclick="myFunc(i)">[btn]</p> </body> </html>

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

  • ベストアンサー
  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.3

変数にはスコープ(参照できる範囲)というものがあります。 質問にあるJavaScriptで言えば、変数iはJavaScript全体から参照できます。このような変数をグローバル変数と言います。 一方、関数内で定義された変数や関数の引数は「その関数内でのみ」参照できます。このような変数をローカル変数と言います。 さてここで関数myFunc()を見てみると、変数hensuはローカル変数ですので関数myFunc()内で hensu = !hensu; こと自体は全く問題ありません。 ただローカル変数に設定された値はそのスコープ内でしか保持しません。 つまり、変数hensuに設定された値は関数myFunc()内でしか保持しないということです。 <p onclick="myFunc(i)">[btn]</p>としてクリックされる度に関数myFunc()を呼び出していますが、これは1度クリックすると関数myFunc()が呼び出されて、そしてこの関数は終了します。 関数が終了した時点で変数hensuが保持している値は失われますので、再びクリックして関数myFunc()を呼び出して場合、「新たな変数hensu」に値が設定されるだけです。 つまり1度目のクリックで呼び出した関数myFunc()内で行っている hensu = !hensu; は意味をなさないことになります。 ○と×交互に表示するためには、回答#1さんが回答されているように <p onclick="myFunc(i=!i)">[btn]</p> とするなど、関数myFunc()の外で値を保持する必要があります。

shiraito
質問者

お礼

ご丁寧な回答有り難うございます。 プログラミングに慣れていないので、 その辺りの考え方でいつもつまずいてしまいます。 大変参考になります。

その他の回答 (2)

回答No.2

たとえば、 function myFunc(hensu){  this.flag = (undefined === this.flag) ? true: this.flag = !this.flag;  alert(this.flag ? '○': '×'); } <p onclick="myFunc()">[btn]</p>

shiraito
質問者

お礼

二度の回答ありがとうございます。 こちらでもできるのですが、 実際に当てはめたいスクリプトには少し合わないようです。 申し訳ありません。

回答No.1

<p onclick="myFunc(i=!i)">[btn]</p> hensu = !hensu; は、さくじょするとか。

shiraito
質問者

お礼

夜分にも関わらず、お早い回答有り難うございます。 参考にさせて頂きます。

関連するQ&A