Возврат значения

функции≈ 7 минут

Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.

Функция без return — исполнитель, который сделал работу и ушёл молча. return — то, что она приносит обратно: значение, которое можно сохранить в переменную, сравнить, передать дальше.

Разделы темы:·

Вызов функции — это выражение, и у него есть значение. Какое именно — решает return: что стоит после него, то и окажется на месте вызова.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Раз вызов — это значение, с ним можно делать всё то же самое, что с обычным числом или строкой: складывать, сравнивать, класть в переменную, передавать в другую функцию.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Если функция ничего не вернула явно, вызов всё равно даёт значение — undefined. Так происходит и когда return в функции нет вовсе, и когда он написан голым, без значения.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

console.log показывает значение человеку, return отдаёт его программе. Это разные вещи: функция может напечатать хоть роман и всё равно вернуть undefined.

Голый return; пишут, когда результат не нужен, а нужно просто выйти из функции пораньше.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.
Что написано в функцииЧто вернёт вызов
return 5;5
return;undefined
return-а нет вообщеundefined
return, а значение — на новой строкеundefined

return не просто отдаёт значение — он мгновенно прекращает работу функции. Строки после него не выполнятся никогда, даже если их десять.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Поэтому return в функции может быть сколько угодно: сработает тот, до которого выполнение дойдёт первым, остальные останутся не у дел.

Приём, когда особые случаи отсекают в начале функции отдельными return, называют ранним возвратом. Сначала разбираемся со странными входными данными, а дальше пишем главный случай — уже спокойно и без вложенности.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Ту же логику можно собрать на if ... else — и тогда основная ветка уедет вправо на пару уровней отступа. Ранний возврат держит код плоским: главное видно сразу, а условия читаются как список исключений.

Вернуть можно что угодно: число, строку, массив, объект, даже другую функцию. Если результатов несколько, не выдумывайте пару функций — упакуйте всё в один объект.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

У стрелочных функций короткая форма возвращает значение сама, без слова return. Но объект в ней приходится оборачивать в круглые скобки — иначе фигурные скобки будут поняты как тело функции, а не как объект. Саму запись разбирает статья «Стрелочные функции»; здесь она встречается только как ещё один способ вернуть значение.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Функция — тоже значение, поэтому её спокойно возвращают из другой функции. Так делают «фабрики»: внешняя функция настраивает внутреннюю и отдаёт готовую. А как внутренняя помнит k после того, как внешняя закончилась, разбирает статья «Замыкания: как функция помнит своё окружение».

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

JavaScript умеет расставлять точки с запятой сам, и после return делает это особенно охотно. Перенос строки сразу за словом return обрывает его: функция возвращает undefined, а значение снизу остаётся недостижимым. Ошибки при этом не будет — код просто тихо работает не так.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Лечится это тем, что значение начинается на той же строке. Если выражение длинное и в одну строку не помещается, откройте круглую скобку сразу после return — тогда движок видит, что предложение ещё не закончилось.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Механизм называется 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), которая возвращает меньшее из двух чисел. Если числа равны — вернуть любое из них.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Достаточно одного сравнения и одного return: результат тернарного оператора и есть возвращаемое значение.

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Вариант с if тоже верен, но следите, чтобы значение возвращалось в каждой ветке — иначе в одном из случаев функция отдаст undefined.

Распрямить вложенность

Функция работает правильно, но условия уехали вправо. Перепишите её через ранний возврат так, чтобы вложенных if не осталось, а поведение не изменилось.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Идея ранних возвратов — идти от исключений к норме: сначала выгоняем всех, кому полный доступ не положен, а последняя строка описывает главный случай.

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Каждое условие теперь читается отдельной строкой-фильтром, и последний return не требует ни else, ни отступов.