2016-06-30 7 views
2
function fun(x){ 
    x++; 
    if(x==2){ 
     fun(x); 
    }else { 
     return x; 
    } 
} 
alert(fun(1)); 

Es Alarm "undefined". aber wenn ich es auf diese Weise schreiben:Warum ist das Ergebnis des Codes nicht definiert?

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

} 
fun(1); 

es alarmiert 3.

Warum es "undefiniert" nicht 3 in der ersten Situation aufmerksam machen? verwirrt darüber ...

+4

Sie müssen '' fun (x); '' zurückgeben. – Arg0n

Antwort

2

ändern es dazu:

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

Andernfalls, wenn Sie keinen Wert aus der Funktion zurückkehr x == 2

+0

Die Frage war "warum" und nicht "wie repariere ich das". Eine Erklärung würde helfen. – mik01aj

+0

@ m01 Glücklich jetzt? – Arg0n

2

In Ihrer if-Anweisung im Fall x == 2 Sie vermissen eine Rücksendeaussage

Dies macht fun Rückkehr undefined.

es dazu ändern sollte es tun:

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

Wenn Sie Chrome-Konsole gehen und sowohl die Codes nacheinander ausführen, werden Sie feststellen, dass in beiden Fällen ‚undefiniert‘ zurückgeführt wird. Der einzige Unterschied besteht darin, dass Sie in einem Fall eine Funktion alarmieren und in anderen Fällen einen tatsächlichen Wert anzeigen.

Im ersten Fall wird undefined angezeigt, da der Alarm den von der Funktion zurückgegebenen Endwert anzeigt. In diesem Fall geben Sie nichts von der Funktion zurück, da die Rückgabe nur im anderen Teil erfolgt. Somit wird ein undefinierter zurückgegeben.

Im zweiten Fall passiert auch das Gleiche. Der letzte Wert wird in der Warnung angezeigt, weil Sie im else-Teil eine Warnung haben.

0

Wenn Sie versuchen, folgende in Google Chrome-Entwickler-Konsole -

Erste Paste -

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

Drücken Sie die Eingabetaste, welche Funktion erklären wird. Dann ruf Spaß (1). Sie werden immer noch undefiniert sein. Dies ist passiert, weil es sich um einen rekursiven Aufruf und in der Callstack-Ausführungssequenz handelt. Aus dem Aufruf der Recusive-Funktion wird der Wert return zurückgegeben. Da jedoch kein return-Schlüsselwort beim rekursiven Aufruf der Funktion verwendet wird, gibt es einen undefinierten Wert.

Ich denke, Callstack spielte hier eine Rolle, was einen undefinierten Wert verursacht, da kein Schlüsselwort zurückgegeben wird.

Bitte teilen Sie Ihre Ansichten, wenn ich irgendwo falsch liege.