为什么代码的结果未定义?

时间:2016-06-30 09:43:27

标签: javascript

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?对此感到困惑......

4 个答案:

答案 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值。

如果我在某处错了,请分享您的观点。