Javascript函数停止被识别

Javascript函数停止被识别,javascript,function,onclick,dom-events,Javascript,Function,Onclick,Dom Events,我对以下代码段有问题: <!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/ja

我对以下代码段有问题:

<!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>
我真的不明白为什么。我做错了什么


(我从James Jaworski的《掌握JavaScript高级版》中获得了大部分代码)

问题在于:

result += s[i];
这样您就可以更改
guess
的上下文。如果你把这行改成

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

    for(i in s)
    {
        guess=s[i];
        result += guess;
    }
    document.game.guessed.value=result;
}
你的错误会消失的。 您的函数与变量使用相同的名称相冲突。 记住使用
var
关键字定义变量,避免这种混淆

1-尽可能使用匿名函数

2-声明和使用局部变量


避免冲突。

问题出在以下几行:

result += s[i];
这样您就可以更改
guess
的上下文。如果你把这行改成

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

    for(i in s)
    {
        guess=s[i];
        result += guess;
    }
    document.game.guessed.value=result;
}
你的错误会消失的。 您的函数与变量使用相同的名称相冲突。 记住使用
var
关键字定义变量,避免这种混淆

1-尽可能使用匿名函数

2-声明和使用局部变量


为避免冲突。

在函数
displayGuessed()
中,您将变量
guess
(这是一个函数)设置为猜测的字母

您可以通过使用“var”关键字定义函数的
guess
变量(使其与函数不同)来解决此问题:


提示:通过使用firefox的Firebug插件,我很容易发现这个bug,它让你一行一行地浏览javascript代码,看看哪里出了问题。

在你的函数
displayGuessed()
中,你将变量
guess
(这是一个函数)设置为猜测的字母

您可以通过使用“var”关键字定义函数的
guess
变量(使其与函数不同)来解决此问题:


提示:通过使用firefox的Firebug插件,我很容易就发现了这个bug,它可以让你逐行检查javascript代码,看看哪里出了问题。

我希望你没有花太多钱……这就是为什么你应该总是定义变量的原因。这实际上是一本书推荐的?别再用那本书了,滚开。看起来已经过时10年了。@gfppaste别让这些巨魔打扰你。话虽如此,您通常可以删除“注释”行,并省略实际未使用的库(例如jQuery导入)。总而言之,很明显,这是一个不错的问题,你正试图自己找出答案。将来,试着注释掉大部分代码,然后一次一小部分地重新介绍它们,直到你开始发现问题。这将使您的注意力集中在导致问题的代码上。@aaaidan我不是在拖拉。我有理由认为他应该从另一本书中学习。我希望你没有付出太多…这就是为什么你应该总是定义你的变量。这实际上是一本书推荐的?别再用那本书了,滚开。看起来已经过时10年了。@gfppaste别让这些巨魔打扰你。话虽如此,您通常可以删除“注释”行,并省略实际未使用的库(例如jQuery导入)。总而言之,很明显,这是一个不错的问题,你正试图自己找出答案。将来,试着注释掉大部分代码,然后一次一小部分地重新介绍它们,直到你开始发现问题。这将使您的注意力集中在导致问题的代码上。@aaaidan我不是在拖拉。我有理由认为他应该从另一本书中学习。我记得在学习javascript时,我发现声明“var”包含当前范围内的变量,而省略关键字则在全局范围内声明变量,这有点违反直觉。别这样!我记得在学习javascript时,我发现声明“var”包含当前范围内的变量,而省略关键字则在全局范围内声明变量,这有点违反直觉。别这样!