Вам нужно return
из каждого места, где вы рекурсивно работаете, чтобы убедиться, что у вас есть все возвраты обратно в стек до исходного вызывающего.Смотрите фрагмент ниже.
function trim(str) {
if (str.charAt(0) === ' ') {
str = str.slice(1);
return trim(str);
} else if (str.charAt(str.length - 1) === ' ') {
str = str.slice(0, -1);
return trim(str);
} else {
return str;
}
}
console.log(trim(' ab c '));
Еще немного контекста:
Каждый раз, когда вы вызываете trim
изнутри тела функции trim
, вы возвращаетесь .Если взять строку ' hello '
и вызвать trim
как (trim(' hello ')
), происходит следующее:
- Вызов
trim(' hello ')
. - Первое
if
условиеmet-- строка нарезается и вызывается trim('hello ')
. - Второе
if
условие выполнено - вызывается строка trim('hello')
. - Нет
if
условие выполняется- else
блок введен `'привет' возвращается.
Таким образом, наш стек вызовов равен trim(' hello ') ==> trim('hello ') ==> trim('hello')
.Однако в той функции, в которой вы ее изначально написали, только последний вызов trim
(trim('hello')
) фактически возвращает значение предыдущему вызывающему - остальные вызовы trim
ничего не возвращают (undefined
).Чтобы убедиться, что возвращаемое значение передается полностью до первоначального вызывающего объекта trim(' hello ')
, вам необходимо убедиться, что каждый раз, когда вы повторяете return
, результат рекурсии.