switchを使って四則演算のプログラムを作りました。
以下プログラム
<html>
<head>
<title>kadai05</title>
<script type=text/javascript>
function Calc(n) {
a = parseInt(document.f.a.value);
b = parseInt(document.f.b.value);
switch (n) {
case 1 : Ans = a + b; break;
case 2 : Ans = a - b; break;
case 3 : Ans = a * b; break;
case 4 : Ans = a / b; break;
}
document.f.c.value = Ans;
}
</script>
</head>
<body>
<center>
<h3>四則演算</h3>
<form name = "f">
<input name="a" size="8"> ☆ <input name="b" size="8"> = <input type="text" name="c" size="10">
<p>
<input type="button" value="+" onclick="Calc(1)"> <input type="button" value="- "onclick="Calc(2)">
<input type="button" value="×" onclick="Calc(3)"> <input type="button" value="÷ "onclick="Calc(4)">
</form>
</center>
</body>
</html>
これは問題集の問題なのですが、答えを見ると
b = parseInt(document.f.b.value)とswitch (n) {
の間に
Ans = 0;が入っています。
これはなぜ入れているのか解説がありません。
特になくても困らないと思うのですが、なぜ入れているのでしょうか?
入れないことでどんな不具合が起きる可能性があるのでしょうか?
教えて下さい。
お願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
#2です。
> TypeError: Cannot read property 'a' of undefined
読み直してみて「何かおかしい」と思ったら、<form> が書かれていないためのエラーでした…。ごめんなさい。
以下のように <form> を入れた場合、
-----
<form name = "f">
<input name="a" size="8"> ☆ <input name="b" size="8"> = <input type="text" name="c" size="10">
<p>
<input type="button" value="+" onclick="Calc(1)"> <input type="button" value="- "onclick="Calc(2)">
<input type="button" value="×" onclick="Calc(3)"> <input type="button" value="÷ "onclick="Calc(4)">
</form>
<script type="text/javascript"><!--
function Calc(n) {
a = parseInt(document.f.a.value);
b = parseInt(document.f.b.value);
switch (n) {
case 1 : Ans = a + b; break;
case 2 : Ans = a - b; break;
case 3 : Ans = a * b; break;
case 4 : Ans = a / b; break;
}
document.f.c.value = Ans;
}
Calc(5);
//--></script>
-----
「Uncaught ReferenceError: Ans is not defined」のエラーが返ってきます。(GoogleChrome4.1で確認)
エラーが返ってくる理由は #2 で述べた理由と同じなので、割愛します。
No.2
- 回答日時:
> 入れないことでどんな不具合が起きる可能性があるのでしょうか?
不具合が起きる可能性が一つあります。
----
function Calc(n) {
a = parseInt(document.f.a.value);
b = parseInt(document.f.b.value);
switch (n) {
case 1 : Ans = a + b; break;
case 2 : Ans = a - b; break;
case 3 : Ans = a * b; break;
case 4 : Ans = a / b; break;
}
document.f.c.value = Ans;
}
Calc(5);
----
このコードを実行すると、
TypeError: Cannot read property 'a' of undefined
のエラーが返ってきます。
Switch文は nの値が 1,2,3,4 のいずれの値である場合にだけ動作するので、変数Ansが初期化されていないのです。
先に、Ans = 0; のように初期化しておけばこの問題は防げます。
「引数にどんな値が来るのか?」「意図しない値が来たときにはどういう挙動にするのか?」
そういった事を考えておくと、安全なコードが出来ます。
しかしながら、もしもっと良いコードを書きたいと思えば、グローバル変数を使わない方が良いです。
var Ans = 0;
のように var を先頭に入れる事で関数内でだけ有効な変数が作れます。
ローカル変数は関数の実行が終了すると同時に解放されます。
No.1
- 回答日時:
>特になくても困らないと思うのですが、なぜ入れているのでしょうか?
たぶん学習途中なので、そう思うかもしれません。基本的に自動で変数が初期化されて、どんな値でもはいるようになっています。
これは、実はプロのプログラマー的(C, C++, javaなど)には、「そんなもの怖くて使えない」と言う事になります。なぜか?
自動 = オート変数 = 設定されていた値が保障されない
となります。実際、業務用ソフトではオート変数はほとんど使われません。私も、そのような実例を見ていて、本来”0”が入っているはずが、”1”が入る時がある? 突き止めたら、リソースなどなくなり、メモリーを確保、リリースを繰り返してゆくと、オート変数として宣言されていたため、犯されていた可能性がある、と言う事で、3000万円以上の代償を払った経験があります。
JavaScriptも例外ではありません。この程度の長さでは、ほとんど見られませんが、ユーザー定義の関数や、クラスが10、50、100以上になると、同じ名前の変数が結構使われます。
そうすると、意図しない値が変数を初期化していないために、入っていて誤動作を起こします。
例として
for(a=1; a>10; a++){
とした場合、動作しますが、他のところで同じループをかくと、あれ? ループが1回も実行されない。なんて事があります。そうならないためには
for(var a=1; a>10; a++){
なぜ? と思わないで、安全のために、誤動作をさせないようにするために、おまじないと思ってください。
これは500行以上の物を作ればわかります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
hiddenのvalueの値を変えたい
-
複数のsubmitボタンで押された...
-
演算対象の数字と演算子を入力...
-
ラジオボタンとテキストを同時...
-
value内に変数を入れたい
-
Pythonで会員サイトの自動ログ...
-
Kintone(キントーン)でドロップ...
-
selectboxのoptionタグのvalue...
-
VBAをJavaScriptに変換したいです
-
JavaScriptでセレクトボックス...
-
JAVASCRIPTで、ボタンを押した...
-
eval()を使わずに数値を取得し...
-
javascriptにてHTMLのhiddenエ...
-
checkboxとselectメニューの連...
-
name属性が同じフォームが複数...
-
VB.NET DateTimeの型について
-
マクロ オブジェクト変数With...
-
Jqueryを使って値の合計を簡単...
-
setIntervalの間隔を途中で変更...
-
正規表現で複数マッチ条件で悩...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
hiddenのvalueの値を変えたい
-
value内に変数を入れたい
-
引数に数値、文字列の混在
-
複数のsubmitボタンで押された...
-
VB.NET DateTimeの型について
-
3桁区切りのカンマをつけたい...
-
javascriptでhiddenに二次元配...
-
フォームで入力した値を別のフ...
-
setIntervalの間隔を途中で変更...
-
jsで、配列内の文章を改行する...
-
Pythonで会員サイトの自動ログ...
-
selectboxのoptionタグのvalue...
-
テキストボックスに入力された...
-
フォーカスすると初期値が消去...
-
ラジオボタンと連動して文字列...
-
セレクトボックスの初期選択状...
-
sessionStorageを調べています。
-
VBAをJavaScriptに変換したいです
-
ダミーフォームの内容を送信用...
-
javascriptで複数の計算を同時...
おすすめ情報