- ベストアンサー
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>
- みんなの回答 (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()の外で値を保持する必要があります。
その他の回答 (2)
- babu_baboo
- ベストアンサー率51% (268/525)
たとえば、 function myFunc(hensu){ this.flag = (undefined === this.flag) ? true: this.flag = !this.flag; alert(this.flag ? '○': '×'); } <p onclick="myFunc()">[btn]</p>
お礼
二度の回答ありがとうございます。 こちらでもできるのですが、 実際に当てはめたいスクリプトには少し合わないようです。 申し訳ありません。
- babu_baboo
- ベストアンサー率51% (268/525)
<p onclick="myFunc(i=!i)">[btn]</p> hensu = !hensu; は、さくじょするとか。
お礼
夜分にも関わらず、お早い回答有り難うございます。 参考にさせて頂きます。
お礼
ご丁寧な回答有り難うございます。 プログラミングに慣れていないので、 その辺りの考え方でいつもつまずいてしまいます。 大変参考になります。