JavaScript全局变量在函数内部变得未定义

时间:2015-10-24 02:11:36

标签: javascript

由于某种原因,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>

4 个答案:

答案 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;   
}

检查一下 - https://jsfiddle.net/sdqyqx21/