为什么这段代码有时会崩溃浏览器?

时间:2013-09-07 19:58:57

标签: javascript

有人可以向我解释为什么这段代码有时会进入一个无限循环(大概来自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!");

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

旧代码如下: (作为优先事项,有人可以告诉我为什么会崩溃?我不明白为什么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();

5 个答案:

答案 0 :(得分:1)

“旧代码”的问题是您在!==条件中使用“严格等同比较”while,除非您将userChoice转换为数字,否则将无法满足提示返回一个字符串值。如果您使用!=代替它。

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

userChoice

答案 1 :(得分:1)

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

首先:

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

在这个功能中,你正在做

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

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

其次,您声明全局userChoice

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

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

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

您将全局userChoice作为参数传递,但在您的函数中,userChoice引用了本地userChoice而不是全局参与。{/ p>

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

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

然后,使用您在第一个位置输入的值执行下一个while。如果此值不满足userChoice !== randNumber,则进入循环;检查userChoice > randNumberuserChoice < randNumber

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

tl; dr - 如何解决此问题

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

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!");
    }
};

答案 2 :(得分:0)

你的问题是:

while(userChoice !== randNumber) {

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

因此,如果randNumber1且用户输入1,则结果仍为字符串。
因此,比较为1 !== "1",即true

因此,你将永远拥有无限循环。 (数字总是!==到字符串)。

您可以将其更改为:

while(userChoice != randNumber) {

答案 3 :(得分:0)

条件

(userChoice !== randNumber)

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

while(userChoice != randNumber)

你会没事的。)

请看一下这个稍微更现代的版本:http://jsfiddle.net/e6gYJ/13/

答案 4 :(得分:0)

我相信这是你的使用!== vs.!=

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

所以

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

,而

5 != '5'; // will be false