我试图学习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。我发现这种行为非常奇怪,并假设它与使用递归引起的动作堆栈的解决有关。请帮助我理解意外行为。
答案 0 :(得分:2)
javascipt中的每个函数都有一个返回值。如果您没有指定任何内容,默认情况下它将是undefined
。在'if'条件下,你返回正确的数字。但是在'else'条件下你再次调用该函数可能会返回一个数字,但由于你没有返回函数调用的结果,引擎只会返回undefined
。 Number(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();
}