2016-06-30 6 views
2
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

Вам нужно вернуть fun (x); '. – Arg0n

ответ

2

Изменить его к этому:

function fun(x){ 
    x++; 
    if(x==2){ 
     return fun(x); 
    } else { 
     return x; 
    } 
} 
alert(fun(1)); //3 

В противном случае вы не возвращает значение из функции, когда x == 2

+0

Вопрос был «почему», а не «как это исправить». Объяснение поможет. – mik01aj

+0

@ m01 Счастливые? – Arg0n

2

В вашем заявлении, если в случае x == 2 вам не хватает оператор возврата.

Это делает это fun return undefined.

Изменение его это должно сделать трюк:

function fun(x){ 
    x++; 
    if(x==2){ 
     return fun(x); 
    }else { 
     return x; 
    } 
} 
alert(fun(1)); 
0

Если вы идете в консоли Chrome и запустить как коды один за другим, вы обнаружите, что в возвращается оба дела «неопределенные». Единственное различие заключается в том, что в одном случае вы предупреждаете о функции, а в другом случае вы сообщаете фактическое значение.

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

Во втором случае также происходит то же самое. Это связано с тем, что у вас есть предупреждение в части else, которую выводит окончательное значение в предупреждении.

0

Если попытаться в следующем Google консоли разработчика Chrome -

Первая паста -

function fun(x){ 
    x++; 
    if(x==2){ 
    fun(x); 
    }else { 
    alert(x); 
    } 
} 

Нажмите Enter, который будет объявлять функцию. Затем вызовите fun (1). Вы все равно получите undefind. Это происходит потому, что это рекурсивный вызов, а в callstack - последовательность выполнения. Из возвращающей функции значение вызова получает возврат, но поскольку ключевое слово возврата не используется при вызове функции рекурсивно, оно дает значение undefind.

Я думаю, что callstack играл здесь роль, которая вызывает значение undefind из-за отсутствия ключевого слова return.

Пожалуйста, поделитесь своими мнениями, если я где-то не прав.