To jest dobry. Rekursja może sprawić, że twoja głowa się zakręci. Powodem, dla którego jest niezdefiniowany, jest to, że nie wszystkie iteracje zwracają wartość, a dla tych, które nie są niezdefiniowane - to tak samo, jak w przypadku ustawienia zmiennej na dowolną funkcję, która nie zwraca wartości.
Jest to mylące z rekurencją, ponieważ wartość zwracana w tym przypadku pochodzi z pierwszej i ostatniej zakończonej iteracji. W przeciwieństwie do zwykłego wywołania metody, w której powrót powoduje przerwanie wykonywania metody - odesłanie jej z powrotem do miejsca, z którego przybył, rekursja nadal ma powracający powrót do stosu wywołań, zwracając wszelkie wartości, które ma oddawać, w tym niezdefiniowane, w odwrotnej kolejności. porządek, w którym zostali wezwani. Tak więc w rzeczywistości wywołuje on cztery wartości zwracane przez console.log: 15, undefined, undefined, undefined.
Ponieważ jest to synchroniczne, console.log nie może zostać wykonane, dopóki nie zostanie wywołana wywołana metoda. To, co przekazuje, jest ostatnią wartością, którą otrzymuje, lub nieokreśloną. Jeśli wrócisz po wywołaniu metody w swoim bloku else, zobaczysz, że otrzymujesz 5 lub wartość acc po pierwszej iteracji funkcji.
var multiplyT = function(a, b, acc) {
if (b == 0) {
console.log("BASE CASE: ", acc);
return acc;
} else {
b--;
acc = acc + a;
console.log("NOT THE BASE CASE: ", a,b,acc);
multiplyT(a, b, acc);
return acc;
}
}
console.log(multiplyT(5,3,0));