Взять, к примеру, вход abcd
.
При первом вызове запускается return reverse(s.slice(1)) + s[0];
. Разбирая аргументы, это превращается в return reverse('bcd') + 'a';
- оно снимает последнюю букву строки и рекурсивно вызывает себя с первыми символами.
При reverse('bcd')
возвращается reverse('cd') + 'b'
.
При reverse('cd')
возвращается reverse('d') + 'c'
.
reverse('d')
, возвращается 'd'
.
На этом этапе рекурсивные вызовы и возвраты разрешаются самостоятельно. reverse('d') + 'c'
. равно 'd' + 'c'
или 'dc'
.
reverse('cd') + 'b'
равно 'dc' + 'b'
или 'dcb'
.
reverse('bcd') + 'a';
равно 'dcb' + 'a'
или 'dcba'
, что вернулся к первоначальному звонку reverse('abcd')
.