Так, ребята - обьясняю приходит массив в аргумент - инициируется новый массив (пустой) потом я нахожу длину массива (который в аргументе) и добавляю в массив res последний элемент массива который пришел из аргумента - далее идет условный оператор (дословно - если длина массива который во входящем аргументе равен 1 то тогда вернуть массив res - который точно есть в замыкании - как минимум это пустой массив, если длина массива приходящего из аргумента больше 1 то тогда из этого массива нужно удалить последний элемент - и рекурсивно вызвать ф-ю reverseString и передать в него массив, который на 1 элемент меньше первоначального аргумента s) я думаю понятно что это будет повторятся до того момента как длина s не станет равна 1 и тогда то как раз код зайдет в первый блок if который и должен вернуть мне значение res (которое как минимум путой массив) и значение которого в замыкании нашей функции - если вы думаете что он каким-то образом не попадает в блок if то это не так (вызывается и работает консоль лог)
Замечательно, но куда вы возвращаете промежуточный результат рекурсивного вызова?
Перед внутренним вызовом reverseString добавьте возврат. А тот символ, который изъяли из конца массива, добавьте в начало.