2014-01-16 46 views
-1

我知道有关于此的类似问题,但这是一个非常简单的版本。我不明白为什么我不能在这里返回变量,虽然我可以看到警报中的值。 这工作:为什么我可以提醒但不能返回?

function theTest(x){ 
     var myNum = x + 1 

     if(myNum == 5){ 
      alert(myNum); 
     } 
     else{ 
      theTest(myNum); 
     } 
    } 

    theTest(0); 

但这返回undefined:

function theTest(x){ 
     var myNum = x + 1 

     if(myNum == 5){ 
      return myNum; 
     } 
     else{ 
      theTest(myNum); 
     } 
    } 

    alert(theTest(0)); 

为什么为什么为什么?

+2

需要'返回theTest(myNum的);' – Doorknob

+1

这个问题实际上是很有趣的。第一个函数将显示警报的原因是因为当您仍在myNum变量的范围内时调用警报。第二个函数将执行相同数量的迭代,但由于递归函数返回未定义,因此不能传回值。 Arvind有一个可以正常工作的解决方案。 – cgatian

+0

cgatian,你会发布作为答案,所以我可以给你信用,请。这个问题不是关于如何,我意识到如何去做。我无法弄清楚为什么,尽管我知道范围是问题。我想给你信用的解释。 –

回答

1

试试这个:

function theTest(x){ 
    var myNum = x + 1 
    if(myNum == 5) 
     return myNum; 
    return theTest(myNum); 
} 

alert(theTest(0)); 
1

因为你else statement不返回任何东西。你调用外部函数theTest并提醒返回的值,但是你的参数是0,所以函数将在else语句中结束,但是在你的代码中,else语句不返回任何东西,所以提醒'undefined'。 试试这个:

function theTest(x){ 
    var myNum = x + 1 

    if(myNum == 5){ 
     return myNum; 
    } 
    else{ 
     return theTest(myNum); 
    } 
} 

alert(theTest(0)); 
+0

我知道这有效,但我不明白为什么其他人必须返回而不是只调用该函数。在许多其他语言中,只要定义了函数,我就可以调用它。返回一个函数没有意义,如果我将它返回给变量... Cgatian有正确的答案 - 他给出了原因,但没有作为答案发布。 –

0

它会对函数进行嵌套/递归调用。因此,在最后一行中,当您启动流程时,如果您返回某些内容(即第一个呼叫),它将只会得到一个值。

因此,多个/嵌套调用也需要多个相应的返回。 或其他(如在你的代码中)myNum将返回到'theTest'的第二次调用(它将在最后一个else语句中)并仅在那里完成。

函数调用是以栈的形式进行的(Last-In-First-Out即LIFO),所以在这里你的第一个调用将在堆栈的底部,在你的情况下你只返回最后一次调用的数据在堆栈的顶部),但是,你需要返回它一路下滑栈,到第一个呼叫

function theTest(x){ 
      var myNum = x + 1 

      if(myNum == 5){ 
       return myNum; 
      } 
      else{ 
       return theTest(myNum); 
      } 
     } 

    alert(theTest(0)); 
+0

这可行,但我想知道为什么。我把这个功能返回到哪里没有意义?到变量?我已经知道这个作品。 –

+0

它将对函数进行嵌套/递归调用。因此,在最后一行中,当您启动该过程时,如果您返回某些内容(即第一个调用),则只会返回一个变量。所以多个/嵌套的调用也需要多个相应的返回。 –

相关问题