function fun(x){
x++;
if(x==2){
fun(x);
}else {
return x;
}
}
alert(fun(1));
警告"未定义"。 但如果我这样写:
function fun(x){
x++;
if(x==2){
fun(x);
}else {
alert(x);
}
}
fun(1);
它会提醒3。
为什么警告"未定义"在第一种情况下不是3?对此感到困惑......
答案 0 :(得分:2)
将其更改为:
function fun(x){
x++;
if(x==2){
return fun(x);
} else {
return x;
}
}
alert(fun(1)); //3
否则,在x == 2
答案 1 :(得分:2)
在你的if语句中,在x == 2
的情况下你缺少一个return语句。
这使fun
返回undefined。
修改它应该可以解决问题:
function fun(x){
x++;
if(x==2){
return fun(x);
}else {
return x;
}
}
alert(fun(1));
答案 2 :(得分:0)
如果您转到Chrome的控制台并逐个运行这两个代码,您会发现在两种情况下都会返回“undefined”。唯一的区别是,在一种情况下,您正在警告某个功能,而在其他情况下,您正在警告实际值。
在第一种情况下显示undefined,因为警报将显示从函数返回的最终值。在这种情况下,您不会从函数返回任何内容,因为返回仅在其他部分中。因此返回undefined。
在第二种情况下,同样的事情正在发生。这是因为你在else部分有警报,最后的值会显示在警报中。
答案 3 :(得分:0)
如果您尝试在Google Chrome开发者控制台中关注 -
首先粘贴 -
function fun(x){
x++;
if(x==2){
fun(x);
}else {
alert(x);
}
}
按enter键将声明功能。然后打电话给乐趣(1)。你仍然会发现不正常的事。这是因为它是递归调用并且在callstack中维护执行顺序。从recusive函数调用值获取return但由于在递归调用函数时没有使用return关键字,因此它给出了unfind值。
我认为callstack在这里扮演了角色,由于没有返回关键字而导致unfind值。
如果我在某处错了,请分享您的观点。