2012-03-25 2 views
1

그래서 나는 다음과 같은 코드에 문제가 있어요 : 나는 game.guess 버튼을 클릭 한 후인식되고 중지 자바 스크립트 함수

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Hangman</title> 

     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 

     <script type="text/javascript"> 
     <!-- 
     gallows = new Array("--------\n|  |\n|\n|\n|\n|\n=====", 
     "--------\n|  O\n|\n|\n|\n|\n=====", 
     "--------\n|  O\n|  |\n|\n|\n|\n=====", 
     "--------\n|  O\n|  \\|\n|\n|\n|\n=====", 
     "--------\n|  O\n|  \\|/\n|\n|\n|\n=====", 
     "--------\n|  O\n|  \\|/\n|  |\n|\n|\n=====", 
     "--------\n|  O\n|  \\|/\n|  |\n|  /\n|\n=====", 
     "--------\n|  O\n|  \\|/\n|  |\n| /\\\n|\n====="); 

     guessChoices = new Array("JavaScript", "Navigator", "LiveConnect", "LiveWire"); 

     guessed = []; 

     function startAgain() 
     { 
      guesses = 0; 
      max = gallows.length - 1; 
      //guessed = " "; 
      len = guessChoices.length - 1; 
      toGuess = guessChoices[Math.round(len*Math.random())].toUpperCase(); 
      displayHangman(); 
      displayToGuess(); 
      displayGuessed(); 
     } 

     function stayAway() 
     { 
      document.game.elements[3].focus(); 
      alert("Don't mess with this form element!"); 
     } 

     function displayHangman() 
     { 
      document.game.status.value=gallows[guesses]; 
     } 

     function displayToGuess() 
     { 
      pattern = ""; 

      for(i=0;i<toGuess.length;++i) 
      { 
       if(guessed.indexOf(toGuess.charAt(i)) != -1) 
        pattern += (toGuess.charAt(i)+" "); 
       else pattern += "_ "; 
      } 

      document.game.toGuess.value=pattern; 
     } 

     function displayGuessed(s) 
     { 

      result=""; 

      for(i in s) 
      { 
       guess=s[i]; 
       result += guess; 
      } 

      document.game.guessed.value=result; 

      //document.game.guessed.value=guessed; 
     } 

     function badGuess(s) 
     { 
      if(toGuess.indexOf(s) == -1) return true; 
      return false; 
     } 

     function winner() 
     { 
      for(i=0;i<toGuess.length;++i) 
      { 
       if(guessed.indexOf(toGuess.charAt(i)) == -1) return false; 
      } 
      return true; 
     } 

     function guess(s) 
     { 
      if(guessed.indexOf(s) == -1) guessed.push(s); 
      if(badGuess(s)) ++guesses; 
      displayHangman(); 
      displayToGuess(); 
      displayGuessed(guessed); 
      if(guesses >= max) 
      { 
       alert("You're dead. The word you missed was "+toGuess+"."); 
       startAgain(); 
      } 
      if(winner()) 
      { 
       alert("You won!"); 
       startAgain(); 
      } 
     } 
     // --> 
     </script> 
    </head> 
     <body> 
      <h1>Hangman</h1> 
      <form name="game"> 
       <pre> 
        <textarea name="status" rows="7" cols="16" onfocus="stayAway();"></textarea> 
       </pre> 

       <p> 
        <input type="text" name="toGuess" onfocus="stayAway();"> Word to guess<br> 
        <input type="text" name="guessed" onfocus="stayAway();"> Letters guessed so far<br> 
       </p> 

       <p>Enter your next guess.</p> 

       <p> 
        <input type="text" name="input" size=1 value=""> 
        <input type = "button" value = "guess" onclick = "guess(game.input.value); game.input.value = '';"> 
       </p> 

       <input type="button" name="restart" value="---- Start Again ----" onclick="startAgain();"> 

       <script type="text/javascript"> 
        <!-- 
        startAgain(); 
        // --> 
       </script> 
      </form> 
     </body> 
</html> 

는, 주위에 처음으로, 나는 예상되는 출력을 얻을를 ... game.input가 지워지고 추측됩니다. 그러나, 나는 다른 값으로 추측 버튼을 클릭하여 두 번째 시간, 나는 오류가 나타납니다

guess is not a function 
| onclick() 
| event = click clientX=77, clientY=33 

guess(game.input.value)     onclick(line 2) 

을 그리고 솔직히 이유를 알아낼 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

감사합니다.

guess=s[i]; 
result += guess; 

당신이 guess의 컨텍스트를 변경하는이 방법 :

+4

너무 많이 지불하지 않았 으면 좋겠다. – max

+0

이것은 항상 변수를 정의해야하는 이유입니다. 그리고 그것은 실제로 책에 의해 권장됩니까? 더 이상 그 책을 사용하지 마십시오. – Ryan

+4

그 책에서 도망 가게. 데이트한지 약 10 년 뒤입니다. – Corbin

답변

4

문제는이 라인에 (I 제임스 Jaworski 보낸 사람에 의해 마스터 자바 스크립트, 프리미엄 에디션에서이 코드의 대부분을 가지고) . 이 줄을

으로 변경하면
result += s[i]; 

오류가 사라집니다. 변수에 동일한 이름을 사용하여 함수를 충돌시킵니다. var 키워드를 사용하여 변수를 정의하고 이러한 혼란을 피하십시오.

1 - 선언하고 충돌을 피하기 위해 지역 변수

를 사용 -

이 가능한 익명 함수를 사용합니다.

+0

나는 자바 스크립트를 배웠던 때가 기억 난다. 나는 "scope"변수를 현재 스코프 내에서 "var"이라고 선언하는 직관적 인 카운터를 발견했다. 반면 키워드를 생략하면 전역 스코프에서 변수를 선언한다. 주의! – aaaidan

0

함수 displayGuessed()에서 변수 인 guess (예상되는 문자)을 추정 된 문자로 설정합니다.

function displayGuessed(s) 
{ 
    var guess; 
    result=""; 

    for(i in s) 
    { 
     guess=s[i]; 
     result += guess; 
    } 
    document.game.guessed.value=result; 
} 

팁 :

당신은 "VAR"키워드를 사용하여 함수의 guess 변수 (함수에서 그것을 구별하기)를 정의하여이 문제를 해결할 수 있습니다 나는 파이어 폭스의 파이어 버그 플러그인을 사용하여 쉽게 버그를 발견 , 당신은 자바 스크립트 코드를 한 줄씩 단계별로 처리 할 수 ​​있습니다.