2014-01-16 5 views
-1

Я знаю, что есть похожие вопросы об этом, но это действительно простая версия. Я не понимаю, почему я не могу вернуть переменную здесь, хотя я вижу значение в предупреждении. Это работает:Почему я могу предупредить, но не вернуться?

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

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

    theTest(0); 

Но это возвращает неопределенное значение:

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

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

    alert(theTest(0)); 

Почему Почему Почему?

+2

вам нужно 'вернуть theTest (тупит);' – Doorknob

+1

Эта проблема на самом деле очень интересно. Причина, по которой первая функция будет отображать предупреждение, состоит в том, что вы вызываете предупреждение, пока вы все еще находитесь в области переменной myNum. Вторая функция будет выполнять одинаковое количество итераций, но так как рекурсивные функции возвращаются undefined, никакое значение не может быть передано обратно. У 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 ничего не возвращает, поэтому alert 'undefined'. Попробуйте это:

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

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

alert(theTest(0)); 
+0

Я знаю, что это работает, но я не понимаю, почему else должен возвращаться, а не просто вызывает функцию. На многих других языках я мог бы просто вызвать функцию после ее определения. Возвращение функции не имеет смысла, если я возвращаю ее переменной ... Кгатян имеет правильный ответ - он дает почему, но не отправил в качестве ответа. –

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

он будет выполнять вложенные/рекурсивные вызовы функции. Поэтому в последней строке, когда вы инициируете процесс, он будет возвращен только с переменной, если вы вернете что-то к ней, то есть к первому вызову. поэтому для множественных/вложенных вызовов потребуется несколько соответствующих возвратов. –

Смежные вопросы