簡體   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