繁体   English   中英

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

[英]JavaScript global variable becomes undefined inside function

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

您正在函数内部再次声明变量。 var target = colors[index]; 如果要为全局target分配colors[index] ,则不要使用var ,否则它将分配给函数内的局部变量。

同意,删除var将解决此问题。 但是,主要问题是您没有为全局目标分配任何内容。

当您执行“ var target = colors [index];”时,您创建了一个名为target的新局部变量,该局部变量仅在do_game函数中可见。 因此,现在您有了两个目标变量,一个是局部变量,一个是全局变量。 当您尝试在check_guess()中访问它时,您访问了尚未分配的全局目标。 但是,如果您从check_guess中删除代码并将其放在do_game中,则它实际上可以工作。

只是想解释为什么它发生的问题。

如果您使用var关键字或不使用var定义任何变量,则在函数外部,它将自动成为全局变量。

如果在没有var关键字的任何函数体中定义了变量,它将也用作全局变量,但是如果使用var定义它,它将成为特定函数的局部变量

您应该将“ guess_input”的返回值添加到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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM