2016-03-21 4 views
1

私はswitch文を追加していくつかの質問に答えることができます。 答えはユーザーの名前で終了したいので、「My name is Alex」と入力すると、「var username」にAlexが保存されます。 "sendUserName"関数を定義する前でも "username"に値が必要です。あなたのコードでswitch文の関数から値を返そうとしています-JS-

<html> 
    <body> 
     <script> 
      var ask = prompt("Ask me anything >>").toLowerCase(); 

      function write(x) { 
       document.write(x) 
      }; 
      //Capitalize the first letter func : 
      function capitalize(string) { 
       return string.charAt(0).toUpperCase() + string.slice(1); 
      } 
      //.............. 
      var question = ask.split(" "); 
      var date = new Date; 
      var userName; 
      //............................... 
      write(userName); // <------ here the issue , undefined ! 
      if (question[0] === "what") { 
       switch (question[1]) { 
        case "time": 
         switch (question[2]) { 
          case "is": 
           switch (question[3]) { 
            case "it": 
             write(date); 
             break; 
            default: 
           }; 
           break; 
          default: 
         }; 
         break; 
        case "is": 
         switch (question[2]) { 
          case "your": 
           switch (question[3]) { 
            case "name": 
             write("Alex !"); 
             break; 
            default: 
           }; 
           break; 
          default: 
         }; 
         break; 
        default: 
         write("unknown"); 
       }; 
      } else if (question[0] === "my") { 
       switch (question[1]) { 
        case "name": 
         switch (question[2]) { 
          case "is": 
           userName = capitalize(question[3]);; 
           alert("Your name is saved, " + userName); 

           function sendUserName() { 
            return userName; 
           } 
           break; 
          default: 
         }; 
         break; 
        default: 
       }; 
      }; 
      sendUserName(); 
      write(userName); // <------- it's work here 
     </script> 
    </body> 
</html> 
+1

ここであなたが何を求めているのかは分かりません。予想される入出力の例を提供し、何が動作しないのかを指定できますか? – Bolza

+0

確かに、 私は変数 "userName"の値を印刷しようとしています...それは主な目標です... ユーザーがプロンプトウィンドウに入力した場合、私は "my name is anyName" 2番目のifステートメント(question [0] == my)question [0] this = myになります。switchステートメントと次のswitchステートメントに移動します。 sendUserName ...動作していないのは、 "write(username);"です。コードの最初に@hallucinations –

答えて

1

あなたはのif-else文やスイッチを介して行くだろう前に、まずwrite(userName)が呼び出されます。 (私の考えでは構造を改善する)回避策は、新しい関数processor(input)を定義し、そこにすべてのロジックを入れてから、write()を呼び出す前にパラメータとしてユーザー入力を使ってその関数を呼び出します。以下のコードを参照してください:

var ask = prompt("Ask me anything >>").toLowerCase(); 

function write(x) { document.write(x) }; 
//Capitalize the first letter func : 
function capitalize(string) { 
    return string.charAt(0).toUpperCase() + string.slice(1); 
} 
//.............. 

var input = ask.split(" "); 
var date = new Date; 
var userName; 
//............................... 
processor(question); // the processor function is called with the value of variable question 

write(userName); // <------ Now it is defined even here 

function processor(input) { 
    if (input[0] === "what") { 

    switch (input[1]) { 
    case "time": 
     switch (input[2]) { 
     case "is": 
      switch (input[3]) { 
      case "it": 
       write(date); 
       break; 
      default: 
      }; 
      break; 
     default: 
     }; 
     break; 
    case "is": 
     switch (input[2]) { 
     case "your": 
      switch (input[3]) { 
      case "name": 
       write("Alex !"); 
       break; 
      default: 
      }; 
      break; 
     default: 

     }; 
     break; 

    default: 
     write("unknown"); 

    }; 

} else if (input[0] === "my") { 

    switch (input[1]) { 
    case "name": 
     switch (input[2]) { 
     case "is": 

      userName = capitalize(input[3]);; 
      alert("Your name is saved, " + userName); 
      break; 

     default: 
     }; 
     break; 



    default: 
    }; 
}; 
} 

function sendUserName() { 
    return userName; 
} 

sendUserName(); 

私はあなたのコードにはあまり触れていません。私はちょうど関数processor(input)の中にあなたのロジックをすべてダンプし、またそれをグローバルにして、それから関数sendUserName()を取り出しました。もちろん、それを元に戻すこともできますが、その関数が定義されているロジックの部分に到達しなければ、関数を呼び出すことでエラーになる可能性があることに注意してください。

+1

こんにちは、ありがとう、それは仕事です! –

+0

なぜプロセッサー機能を定義したのか教えてください。 「入力」パラメータは何をしましたか? @AryKay –

+0

更新された回答を確認してください。ロジックをグローバルスコープから分離できるように、 'processor(input) 'を定義しました。一般的には、可能な限り多くのロジックのために関数を定義することをお勧めします。入力パラメータは、値を定義できるローカルパラメータです。 14行目の 'processor(question);'が呼び出され、プロセッサ関数内の 'input'の値が変数' question'の値と同じであることに注意してください。 Javascriptで同期関数と非同期関数について読むと、コードの実行順序を知ることができます。 – AryKay

関連する問題