来自提示符js的意外行为

时间:2016-01-09 02:05:20

标签: javascript

我试图学习javascript,作为练习的一部分,我决定尝试创建一个二十一点模拟器,以提高我的准确性和技能。

以下是程序中的一个独立块。为简单起见,我使用提示而不是html界面。

function askAboutAce(){
    var nResponse = 0;
    var response = 0;
    response = prompt("Would you like to use the ace as a 1 or 11?");
    if(response === "1" || response === "11"){
        nResponse = Number(response);
        return nResponse;
    }
    else{
        askAboutAce();
    }
}

var x = 2 + askAboutAce();
console.log(x);

线var x = 2 + askAboutAce();模拟玩家首先绘制2,然后绘制一张Ace。当我执行以下操作时会发生奇怪的行为:如果提示询问我想要使用ace做什么,并且我正确响应(即使用1或11),则返回值为数字。但是,如果我回答错误(通过输入除1或11之外的任何其他数字)然后最终输入1或11,则返回值为NaN。我发现这种行为非常奇怪,并假设它与使用递归引起的动作堆栈的解决有关。请帮助我理解意外行为。

3 个答案:

答案 0 :(得分:2)

javascipt中的每个函数都有一个返回值。如果您没有指定任何内容,默认情况下它将是undefined。在'if'条件下,你返回正确的数字。但是在'else'条件下你再次调用该函数可能会返回一个数字,但由于你没有返回函数调用的结果,引擎只会返回undefinedNumber(undefined)NaN。对undefined使用'+'运算符会尝试将其强制转换为数字。有关隐式强制的规则更多。

在else条件下使用return askAboutAce();

答案 1 :(得分:1)

这是个人偏好,但这里并不需要递归。我认为askAboutAce函数更简单,也许更容易理解的方法就是这个

function askAboutAce(){
    var response;
    do {
        response = prompt("Would you like to use the ace as a 1 or 11?");
    } while (response !== "1" && response !== "11")

    return Number(response);

}

var x = 2 + askAboutAce();
console.log(x);

答案 2 :(得分:0)

这是因为在这个块的代码中......

if(response === "1" || response === "11"){
    nResponse = Number(response);
    return nResponse;
}
else{
    askAboutAce();
}

else语句没有返回任何内容。 askAboutAce()的值只是返回到......无处。

所以你需要从该方法返回输出。

EX:

else{
    return askAboutAce();
}