- ベストアンサー
JavaScript関数で入力された日付から未来の日付を表示する方法
- JavaScriptの関数を使用して、入力された日付から30日後、40日後、60日後、90日後の日付を表示する方法について教えてください。
- 作成した関数が1回しか使えない状態になっているようです。何回でも使えるようにする方法を教えてください。
- 初歩的な質問かもしれませんが、どうすれば作成した関数を複数回実行できるようにすることができますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これがダメなのでは? Date = new Date(document.form.y.value, document.form.m.value -1, document.form.d.value); Dateを上書きして、元のDateを破壊しています。 大文字のDateだとシステムのDateを破壊してしまうので例えば、小文字のdateを使ってみてはいかがでしょうか? date = new Date(document.form.y.value, document.form.m.value -1, document.form.d.value); 当然、これ以降に出てくるDateはdateに書き換えてください。 d = date.getDate(); のような感じです。 あと、変数を最初に使うときはvarをつけてちゃんと宣言したほうがいいですね。こうやって変数が使える範囲(スコープと言いますが)を制限します。 var date = new Date(document.form.y.value, document.form.m.value -1, document.form.d.value); var d = date.getDate(); のような感じで。 関数の中で変数を使うときにvarで宣言しておくと関数の外からそれが見えなくなるので、多少破壊的なことを関数でやってもその影響を外に及ぼさなくなります。プログラムのどこからでも参照できるグローバル変数は便利で、その弊害を誰も教えてくれないので初心者はついつい使ってしまいますが、局所性が保証されなくなるので必要な場合を除いては使わないほうがいいです。 関数内でvarを使う場合、関数の外からその値が見えなくなるので、関数から値を帰す場合はちゃんとreturnで返して受け取らないと受け取れません。 しかも、JavaScriptは複数の返り値を持てないのでちょっと工夫が必要です。 例えば、 function Kekka(days){ ...略... var str1 = ... ...略... var str2 = ... ...略... return Array(str1,str2); } としておき、 k = Kekka(30); document.form.v1.value = k[0]; document.form.v1_2.value = k[1]; と書く方法があります。 あるいは、連想配列を使うこともできます。 function Kekka(days){ ...略... var ret = {} ret.str1 = ... ...略... ret.str2 = ... ...略... return ret; } としておき、 k = Kekka(30); document.form.v1.value = k.str1; document.form.v1_2.value = k.str2; という感じです。 あとは、日付に変換するところもtoLocaleString()でよいならわざわざ各必要ないかと...strftimeがないのが良くないとは思いますが。 というわけで、Dateを破壊していたのを修正しましょう。 また、可能ならばvarを使って変数のスコープを関数内に制限しましょう。
その他の回答 (1)
Date = new Date(document.form.y.value, …… これが原因ですね。Dateオブジェクトを上書きしてしまっているので、次にnew Dateしたときには前回作成したオブジェクトがDateに設定されており、Dateコンストラクタ関数ではなくなってしまってます。なので、Dateという変数名を変えてください。
お礼
回答ありがとうございます。! わかりやすく、勉強になりました!。
お礼
ありがとうございます! Dateを破壊していた→予約語みたいなものを使っていた? とにかく正常に動作するようになりました。 他の指摘についても、参考になります。TT 丁寧な解説ありがとうございます。 回答を参考にさせていただいて、 これから精進していきたいと思います!