Возврат значения
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Функция без return — исполнитель, который сделал работу и ушёл молча. return — то, что она приносит обратно: значение, которое можно сохранить в переменную, сравнить, передать дальше.
Вызов функции — это выражение, и у него есть значение. Какое именно — решает return: что стоит после него, то и окажется на месте вызова.
Раз вызов — это значение, с ним можно делать всё то же самое, что с обычным числом или строкой: складывать, сравнивать, класть в переменную, передавать в другую функцию.
Если функция ничего не вернула явно, вызов всё равно даёт значение — undefined. Так происходит и когда return в функции нет вовсе, и когда он написан голым, без значения.
console.log показывает значение человеку, return отдаёт его программе. Это разные вещи: функция может напечатать хоть роман и всё равно вернуть undefined.
Голый return; пишут, когда результат не нужен, а нужно просто выйти из функции пораньше.
| Что написано в функции | Что вернёт вызов |
|---|---|
| return 5; | 5 |
| return; | undefined |
| return-а нет вообще | undefined |
| return, а значение — на новой строке | undefined |
return не просто отдаёт значение — он мгновенно прекращает работу функции. Строки после него не выполнятся никогда, даже если их десять.
Поэтому return в функции может быть сколько угодно: сработает тот, до которого выполнение дойдёт первым, остальные останутся не у дел.
Приём, когда особые случаи отсекают в начале функции отдельными return, называют ранним возвратом. Сначала разбираемся со странными входными данными, а дальше пишем главный случай — уже спокойно и без вложенности.
Ту же логику можно собрать на if ... else — и тогда основная ветка уедет вправо на пару уровней отступа. Ранний возврат держит код плоским: главное видно сразу, а условия читаются как список исключений.
Вернуть можно что угодно: число, строку, массив, объект, даже другую функцию. Если результатов несколько, не выдумывайте пару функций — упакуйте всё в один объект.
У стрелочных функций короткая форма возвращает значение сама, без слова return. Но объект в ней приходится оборачивать в круглые скобки — иначе фигурные скобки будут поняты как тело функции, а не как объект. Саму запись разбирает статья «Стрелочные функции»; здесь она встречается только как ещё один способ вернуть значение.
Функция — тоже значение, поэтому её спокойно возвращают из другой функции. Так делают «фабрики»: внешняя функция настраивает внутреннюю и отдаёт готовую. А как внутренняя помнит k после того, как внешняя закончилась, разбирает статья «Замыкания: как функция помнит своё окружение».
JavaScript умеет расставлять точки с запятой сам, и после return делает это особенно охотно. Перенос строки сразу за словом return обрывает его: функция возвращает undefined, а значение снизу остаётся недостижимым. Ошибки при этом не будет — код просто тихо работает не так.
Лечится это тем, что значение начинается на той же строке. Если выражение длинное и в одну строку не помещается, откройте круглую скобку сразу после return — тогда движок видит, что предложение ещё не закончилось.
Механизм называется ASI — автоматическая вставка точки с запятой. Он работает не после каждой строки, но есть ключевые слова, после которых перенос обрывает конструкцию всегда: return, break, continue, throw, а также операторы ++ и --. Правило для запоминания одно: то, к чему они относятся, обязано начинаться на той же строке.
- return задаёт значение, которым становится вызов функции: его можно сохранить, сравнить, передать дальше.
- Функция без return, как и голый return;, возвращает undefined — ошибки при этом не будет.
- return мгновенно завершает функцию: код после него не выполнится, поэтому нескольких return в теле бояться не нужно.
- Ранний возврат отсекает особые случаи в начале и держит основную логику плоской, без лестницы из else.
- Перенос строки сразу после return обрывает его — значение пишут на той же строке или оборачивают в круглые скобки.
1/3Функция выполнилась до конца и ни разу не встретила return. Что окажется в переменной, куда записали результат вызова?
2/3После слова return сделали перенос строки, а значение 7 написали строкой ниже. Что вернёт такая функция?
3/3Стрелочная функция записана как () => { id: 1 }. Что она вернёт?
Функция min
Напишите функцию min(a, b), которая возвращает меньшее из двух чисел. Если числа равны — вернуть любое из них.
Достаточно одного сравнения и одного return: результат тернарного оператора и есть возвращаемое значение.
Вариант с if тоже верен, но следите, чтобы значение возвращалось в каждой ветке — иначе в одном из случаев функция отдаст undefined.
Распрямить вложенность
Функция работает правильно, но условия уехали вправо. Перепишите её через ранний возврат так, чтобы вложенных if не осталось, а поведение не изменилось.
Идея ранних возвратов — идти от исключений к норме: сначала выгоняем всех, кому полный доступ не положен, а последняя строка описывает главный случай.
Каждое условие теперь читается отдельной строкой-фильтром, и последний return не требует ни else, ни отступов.