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”包含当前范围内的变量,而省略关键字则在全局范围内声明变量,这有点违反直觉。别这样!