С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 1 / 1
Регистрация: 22.02.2023
Сообщений: 6

Непонятное мне поведение return в коде

22.02.2023, 20:24. Показов 417. Ответов 2

Студворк — интернет-сервис помощи студентам
Была задача написать что-то вроде цензора: (вручную, просто задача на усвоение материала) приходят пары "слово1", "слово2" и потом приходит некая строка, в которой надо найти "слово1" и заменить на "слово2".

Код написал с использованием рекурсии и все должно было бы работать, но... ...не ретернится тогда, когда ожидается:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function censor() {
    let arrOfInputs = [];
    const censorInAction = (input, output = "let's go and censor it!") => {
        if (output === "let's go and censor it!") {
            let i = 0;
            if (arrOfInputs.length > 0) {
                function doCensIt() {
 
                    if (i === arrOfInputs.length) return input; [I]// ТУТ ОТДАЕТ undefind вместо input..............[/I]
 
                    input = input.replace(new RegExp(`${arrOfInputs[i][0]}`, 'gi'), arrOfInputs[i][1]);
                    i++;
                    doCensIt();
                }
                doCensIt();
            }
        } else {
            arrOfInputs.push([input, output]);
        }
    }
    return censorInAction;
}
 
const changeScene = censor();
 
changeScene('PHP', 'JS');
changeScene('backend', 'frontend');
console.log(changeScene('PHP is the most popular programming language for backend web-development'));
Работать код начинает, только если добавить ретерны тут
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
//////////////
            if (arrOfInputs.length > 0) {
                function doCensIt() {
 
                    if (i === arrOfInputs.length) return input; [I]// ТУТ ОТДАЕТ undefind вместо input..............[/I]
 
                    input = input.replace(new RegExp(`${arrOfInputs[i][0]}`, 'gi'), arrOfInputs[i][1]);
                    i++;
                    return doCensIt(); // ТУТ 
                }
                return doCensIt(); // И ТУТ
            }
//////////////
Причем только с двумя return работает.

Писал практически идентичный код через цикл for - все нормально ретернилось... Не понимаю, почему тут именно так срабатывает, с лишними ретернами? Подскажите логику... Может нюансы какие есть? Или я где-то не улавливаю логику?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2023, 20:24
Ответы с готовыми решениями:

Непонятное поведение return
Добрый вечер, господа! Есть некий массив в котором присутствуют строки и числа a =. Задача заключается в переборе массива с помощью...

Непонятное мне поведение функции
Эта функция себя странно ведёт. Она работает и если с первого раза ввести цифры с клавиатуры, то работает корректно, но если сначала ввести...

Непонятное поведение поведение TIM6 на STM32f4discovery
Вводные данные: SYSCLK=168Мгц; AHB Pressotir=1; APB1 Pressotir=4; TIM6_Pessotir=3; Т.о. частота тактирования на таймере=42Мгц ...

2
Модератор
Эксперт HTML/CSS
 Аватар для AlexZaw
2379 / 1739 / 677
Регистрация: 07.08.2016
Сообщений: 4,093
22.02.2023, 23:26
Лучший ответ Сообщение было отмечено ElArahnid как решение

Решение

Цитата Сообщение от ElArahnid Посмотреть сообщение
Подскажите логику... Может нюансы какие есть?
Объясню на таком примере:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function foo() {
  console.log(1);
 
  function bar() {
    console.log(2);
 
    function baz() {
      console.log(3);
      return "baz";
    }
 
    baz();
  }
 
  bar();
}
примерно тоже самое происходит и у вас.
Вызвав foo() мы увидим в консоли только 1, 2,3 но не увидим "baz"
Теперь по шагам (выводы в консоль описывать не буду, с ними и так все понятно):
1. Запускаем foo()
2. foo вызывает bar() и ждет окончания ее работы.
3. bar вызывает baz() и тоже ждет окончания ее работы, foo в этот момент ждет их обоих
4. baz возвращает строку "baz" и заканчивает свою работу
5. bar получила результат работы baz, но мы его никуда не сохранили и ничего не возвращаем из функции, а раз нет явного указания return то по умолчанию функция возвращает undefined. bar заканчивает свою работу.
6. foo получает результат работы bar - undefined, тоже никуда его не сохраняет и так как нет явного return то по умолчанию тоже возвращает undefined.

Можно представить это проще, на место вызова функций bar() и baz() подставьте то, что они возвращают. Получим:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function foo() {
  console.log(1);
 
  function bar() {
    console.log(2);
 
    function baz() {
      console.log(3);
      return "baz";
    }
 
    baz(); // (1)тут вместо вызова после срабатывания функции будет строка "baz" которая никуда не сохраняется
  }
 
  bar(); // (2)тут будет undefined который нам вернет bar
}
foo(); // (3) тут будет undefined который нам вернет foo
Добавлено через 3 минуты
P.S. т.е. ваш return input; возвращает то что положено, а вот в предыдущих вызовах функции doCensIt(); нет явного return и они возвращают undefined
2
2 / 1 / 1
Регистрация: 22.02.2023
Сообщений: 6
22.02.2023, 23:34  [ТС]
Понял! Все дело во вложенности return-ов! Приблизительно так и думал, но вы наглядно пояснили. Благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2023, 23:34
Помогаю со студенческими работами здесь

Непонятное поведение
Всем привет! В книге "Прата - Язык программирования C++. Лекции и управжения 2011" нашёл вот такой пример: const free_throws...

Непонятное поведение
Всем привет) Задача: выбрать файл и , если это картинка, вывести изображение в окне браузера (причем размер должен быть не более 300px...

Непонятное поведение
Касперский обнаружил немного мусора. После загрузки компьютер работает нормально, но со временем начинает подтормаживать. То ли железоЮ то...

Непонятное поведение ОС
Здрасте! Купил новый комп, а он загружается через раз (чаще через несколько раз), выключается долго, и один раз не вышел из спячки. ...

Непонятное поведение программы
Привет народ, вот кароч: #include"stdafx.h" #include"iostream" using namespace std; class calc{ int *i, *j; public: int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru