0

谁能向我解释为什么这段代码有时会进入无限循环(可能来自 while 循环)并使浏览器窗口崩溃?是不是有什么关系while(userChoice != randNumber),这没有一个足够的结局吗?

var check = function(userChoice) {
        while ((isNaN(userChoice)) || (userChoice > 100) || (userChoice < 1) || (userChoice %1 !== 0)) {
        userChoice = prompt("Choose a number between 1 - 100", "It must be a whole number!");
    }
};

var randNumber = Math.floor(Math.random() * 100 + 1);
var userChoice = prompt("Choose a number between 1 - 100");
console.log(userChoice);
check(userChoice);
//Above sorts out the computer choice and sets the rules for the user choice

while(userChoice != randNumber) {
    if (userChoice > randNumber) {
        userChoice = prompt("Your number is GREATER than the computer.", "Please re-choose a number between 1 - 100");
        check(userChoice);
    }
    else if (userChoice < randNumber) {
        userChoice = prompt("Your number is SMALLER than the computer.", "Please re-choose a number between 1 - 100");
        check(userChoice);
    }
}    

console.log("Your number matches! Congratulations!");

这是对我之前的一些代码的修改,它会更频繁地崩溃。虽然上面的代码更稳定,但它仍然偶尔会崩溃,虽然我无法解释启动无限循环的确切过程。

旧代码如下:( 有人可以优先告诉我为什么会崩溃吗?我不明白为什么当达到正确的数字时while循环没有结束!)

main = function() {


var randNumber = Math.floor(Math.random() * 100 + 1);
var userChoice = prompt("Choose a number between 1 - 100");
while ((isNaN(userChoice)) || (userChoice > 100) || (userChoice < 1) || (userChoice %1 !== 0)) {
    userChoice = prompt("Choose a number between 1 - 100", "It must be a whole number!");
}
//Above sorts out the computer choice and sets the rules for the user choice

while(userChoice !== randNumber) {
    if (userChoice > randNumber) {
        userChoice = prompt("Your number is GREATER than the computer.", "Please re-choose a number between 1 - 100");
    }
    else if (userChoice < randNumber) {
        userChoice = prompt("Your number is SMALLER than the computer.", "Please re-choose a number between 1 - 100");
    }
}    

return("Your number matches! Congratulations!");

};
main();
4

5 回答 5

1

“旧代码”的问题在于,除非您将 userChoice 强制转换为数字,否则您在无法满足!==的条件下使用“严格相等比较”,因为提示返回字符串值。while如果你改用它会起作用!=

“新代码”的问题与闭包有关,在check函数内部创建了一个新的局部变量userChoice,因为您传递了一个参数,这意味着userChoice内部检查与userChoice您在外部声明的不同,您可以删除参数并使用您定义的全局变量:

var check = function() {...}
... 
var userChoice = prompt("Choose a number between 1 - 100");
check();
于 2013-09-07T20:43:12.397 回答
1

我想我已经设法找到代码进入无限循环的原因:

第一的:

var check = function(userChoice) { .... };

在这个函数里面,你正在做

userChoice = prompt("[...]");

userChoice引用了userChoice函数的参数。因此,它不能更改userChoice您在下面定义的全局变量,因为它是一个完全不同的变量。

其次,你声明你的 global userChoice

var userChoice = prompt("Choose a number between 1 - 100");

这会在全局范围内创建一个变量userChoice,并分配用户在提示中输入的任何内容。可能是字符串!!

然后,您执行功能检查: check(userChoice);

您将全局userChoice作为参数传递,但在您的函数内部,userChoice引用本地userChoice而不是全局。

输入不大于 100 且小于 1 的整数值后,while 退出...

此时,全局userChoice仍然是您最初输入的值,因为您操纵了另一个变量(本地变量)。

然后,您使用您首先输入的值执行下一个 while。如果该值不满足userChoice !== randNumber,则进入循环;检查是否userChoice > randNumberuserChoice < randNumber

如果您输入了一个字符串,这三个检查将失败。因此,创建了一个无限循环。

tl;博士 - 如何解决这个问题

删除检查函数的参数,这样就不会创建局部变量:

function check() {
    while ((isNaN(userChoice)) || (userChoice > 100) || (userChoice < 1) || (userChoice %1 !== 0)) {
        userChoice = prompt("Choose a number between 1 - 100", "It must be a whole number!");
    }
};
于 2013-09-07T21:08:05.833 回答
0

你的问题是:

while(userChoice !== randNumber) {

userChoice(的结果)的结果prompt是一个字符串并且randNumber是一个数字。

所以如果randNumber1并且用户输入1的结果仍然是一个字符串。
所以比较是1 !== "1"哪个true

因此,您将永远有一个无限循环。(一个数字总是!==一个字符串)。

您可以将其更改为:

while(userChoice != randNumber) {
于 2013-09-07T20:40:23.427 回答
0

条件

(userChoice !== randNumber)

永远不能为假,因为“!==”表示“不同但类型相同”,并且提示返回一个字符串,而不是一个数字!所以一旦你猜对了数字,循环就永远不会结束。它只会在您找到答案后崩溃,因为在此之前提示会减慢循环速度。

while(userChoice != randNumber)

你会没事的:)

也看看这个稍微现代一点的版本:http: //jsfiddle.net/e6gYJ/13/

于 2013-09-07T20:41:16.347 回答
0

我相信这是您对 !== 与 != 的用法

当您使用 !== 时,您将明确匹配类型 AND 值。

所以

5 !== "5"; //will be true
5 !== 5; //will be false

然而

5 != '5'; // will be false
于 2013-09-07T20:42:22.997 回答