質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

Javascript 正しいループ処理

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 195

score -1

promptへ文字列を入力させ、
タイプミスした場合は、最初のif文へループするようにしたいです。
下記のように自分で書いてみたのですが、そのようには動かないので(ループしない)、
アドバイスいただけますと助かります。

function startPrompt(){
 startPrompt = prompt('"yes" or "no"を入力してください');
 startPrompt = startPrompt.toLowerCase();
 while (true){
 if ( startPrompt === 'yes'){
  goShopping()
 }else if (startPrompt === 'no'){
  alert('さようなら')
  break;
 }else {
  return true;
 }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

間違いがたくさんあります。

まず、startPromptfunctionとして定義したのに、
その中でstartPromptを変数?として使っています。
別の名前にしなければなりません。
たとえばanswerとしましょう。

そしてanswerという変数を使うには、
var answer = prompt('"yes" or "no"を入力してください');
などのようにしなければなりません。
この場合varではなくletでもよいです。
varletの違いは後で調べてください。ついでにconstも。

goShoppingを呼ぶのはいいですが、goShoppingから帰ってきた後の処理が抜けているようです。
このままではwhileでループして無限にgoSHoppingを呼ぶことになります。

answerが'yes'でも'no'でもなかったとき、returnしてしまっています。
それでは当然入力のやり直しにはなりません。

このループが、'yes'でも'no'でもなかったときに入力をやり直すようにしたいなら、
promptの呼び出しはwhileループの中に無ければならないですね。
そうでないとanswerは一生変化しないので無限ループになります。

whileのブロック{を閉じる}がありません。

えーと、とりあえず、このくらいかな?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

文法エラーにはなってないのですよね?であれば、質問文へのコピペに失敗して途中で切れてますよ。

本題:
おちついて、処理を最初から追ってみましょう。声に出して読むのも有効です。
どんな処理を繰り返しているでしょうか?promptは繰り返さなくて良いのでしょうか?
"yes"の場合にどうしたいのでしたっけ?
"no"の場合にどうしたいのでしたっけ?
"yes"でも"no"でもない場合にどうしたいのでしたっけ?

追加のアドバイス:
・関数名と同名の変数を使うと混乱の元です。
varとかletとかを学びましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

苦戦してますね。
このくらいのコード量ならば必要性は感じないかもしれませんが、
機能を関数で分割するとパッと見て分かりやすくなりますよ。

function startPrompt(){
  let ans;
  while(true) {
    ans = getCommand();
    if (ans == '') contine;
    if (ans == 'yes') {
      goShopping();
    } else {
      alert('さようなら');
    }
    break;
  }
}

function getCommand() {
  const cmd = prompt('"yes" or "no"を入力してください');
  let ret = cmd.toLowerCase();
  if (ret != 'yes' && ret != 'no') ret = '';
  return ret;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/04 07:43

    ありがとうございます。
    初心者なため、大変助かります。
    こういう書き方もあるのですね、確かに理解しやすいし、見やすいです。
    勉強になりました。

    キャンセル

  • 2021/05/04 12:39

    (・∀・)b

    キャンセル

-2

ご丁寧にありがとうございます。
ご指摘いただいた箇所を下記のように訂正したら、やりたかったことは実現できました。

function startPrompt(){
while (true){ 
let answer = prompt('"yes" or "no"を入力してください');
answer = answer.toLowerCase();
if ( answer === 'yes){
goShopping()
}else if (answer === 'no'){
alert('さようなら')
break;
}else {
startPrompt ();
}
}}

1) 入力のやり直しは、else で再度startPrompt ()を呼ぶで良いのでしょうか?
2) goShopping 関数から返ってきたときは、何を書くか決めてませんがgoShopping関数内でstartPrompt() に行くように書こうと思ってました。(初心者なので、どうすべきが最適なのか分かっておりませんので、ご指摘いただけますと幸いです。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/04 02:28

    1) 2) いずれも、それでは再帰呼び出しになってしまいます。
    関数について基本を学びましょう。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る