由于某种原因,JavaScript全局变量在函数内部变得未定义。无法弄清楚原因。您可以复制并运行代码。正如您所看到的那样,全局变量' target'在第一个警报中定义,但在函数内部变为未定义。 这是代码:
<!doctype html>
<html>
<head>
<title>Colors</title>
</head>
<body onload="do_game()">
<script>
var target;
var guess_input;
var finished = false;
var guesses = 0;
var colors = ['blue','brown','gold','gray','green','orange','pink','purple','red','yellow'];
function do_game() {
var random_number = Math.random() * 10;
var index = Math.floor(random_number);
var target = colors[index];
alert("target = " + target);
while (!finished) {
guess_input = prompt("I am thinking of one those colors:\n\n"+ colors +
"\n\nWhat color am I thinking of?").toLowerCase();
guesses += 1;
finished = check_guess();
}
}
function check_guess() {
alert('guess_input=' + guess_input +', target=' + target);
return true;
}
</script>
</body>
</html>
答案 0 :(得分:6)
您在函数内再次声明变量。 var target = colors[index];
。如果您要将colors[index]
分配给全局target
,请不要使用var
,否则会将其分配给函数内的局部变量。
答案 1 :(得分:0)
同意,删除var将解决问题。但主要问题是您没有为全局目标分配任何内容。
当你做了&#34; var target = colors [index];&#34;时,你创建了一个名为target的新局部变量,它只在do_game函数中可见。所以现在你有两个目标变量,一个是本地变量,一个是全局变量当您尝试在check_guess()中访问它时,您访问了尚未分配的全局目标。但是如果从check_guess中删除代码并将其放在do_game中,它实际上会起作用。
只是想解释为什么会这样的问题。
答案 2 :(得分:0)
如果你使用var关键字或没有var定义任何变量,在函数之外它将自动成为全局变量。
如果在没有var关键字的任何函数的主体中定义了变量,它也将作为全局变量工作,但如果使用var定义它,它将成为特定函数的局部变量
答案 3 :(得分:0)
您应该添加&#39; guess_input&#39;的返回值。到check_guess函数的参数
function do_game() {
var random_number = Math.random() * 10;
var index = Math.floor(random_number);
var target = colors[index];
alert("target = " + target);
while (!finished) {
guess_input = prompt("I am thinking of one those colors:\n\n"+ colors +
"\n\nWhat color am I thinking of?").toLowerCase();
guesses += 1;
finished = check_guess(guess_input);
}
}
function check_guess(target) {
alert('guess_input=' + guess_input +', target=' + target);
return true;
}