Javascript 函数停止被识别

标签 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/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.guess 按钮后,第一次,我得到了预期的输出... game.input 清除并显示 guessed。但是,我第二次单击具有不同值的猜测按钮时,收到错误消息:

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

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

老实说,我不明白为什么。我做错了什么?

(我从 James Jaworski 的 Mastering JavaScript, Premium Edition 中获得了大部分代码)

最佳答案

问题出在这几行:

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

这样你就改变了guess的上下文。如果将此行更改为

result += s[i];

您的错误将会消失。 您将函数与对变量使用相同的名称相冲突。 请记住使用 var 关键字定义变量并避免此类混淆。

1 - 尽可能使用匿名函数

2 - 声明和使用局部变量

为了避免冲突。

关于Javascript 函数停止被识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857929/

相关文章:

javascript - D3 时间解析返回 null

javascript - 对在 mvc asp.net 中查看 js 文件感到困惑

java - 创建一个函数来预测某个处理器的故障概率

jquery - 将 .live ("click"与彼此内部的元素一起使用时,如何仅引用一个元素?

javascript - 将 curl GET 转换为 javascript fetch

javascript - AngularJS 使用工厂来计算对象的更改

python - 求和python列表中的整数但不包括数字13和紧随其后的数字

R:source() 和源文件的路径

twitter-bootstrap - Yii TbCarousel onclick 链接

android - Android 上的 AutoCompleteTextView 点击事件