Почему функция «возвращает» значение?
Изучающие программирование часто удивляются: почему функция «возвращает» результат? Почему именно такое странное слово — «возврат»? Как будто мы сначала даём ей результат, а потом она его возвращает обратно.
Понятно, что это не так. Мы даём функции аргументы (а иногда и вообще не даём ничего), а она даёт нам в ответ какую-то информацию… А иногда не даёт! Тогда мы говорим «она ничего не возвратила».
Дело в том, что return означает не возврат информации, а возврат управления.
При вызове функции текущий код становится на паузу и передаёт управление в функцию. Функция делает свои дела и возвращает управление в то место, где происходил вызов. И заодно может отправить какую-то информацию туда.
Что за управление? Управление той штукой, которая исполняет код. Грубо говоря — управление компьютером. Код передаёт функции пульт управления компьютером, а функция потом возвращает его обратно.
const sum = (a, b) => const answer = a + b; return answer; >
Мы привыкли читать подобный код как «функция возвращает значение answer », но правильнее будет читать «функция возвращает управление в место вызова и отправляет туда значение answer».
Именно поэтому внутри функции возможен такой код:
. return; .
Здесь функция не «возвращает ничего», а «возвращает управление в место вызова и не отправляет туда никакую информацию».

Конечно, такая формулировка хоть и технически более корректна, в реальной жизни нет смысла отказываться от «возвращает значение». Это, можно сказать, общепринятое сокращение.
Полезная информация Начните изучать разработку с бесплатного курса «Основы современной вёрстки». Вы научитесь создавать статические веб-страницы, стилизовать элементы, использовать редакторы кода с полезными расширениями. В конце курса вы опубликуете свой первый сайт на GitHub Pages.
Зачем нужен return при повторном вызове функции из кода?
Здесь добавлен еще один return в момент перезапуска функции при обнаружении двузначного числа, но зачем там нужен этот return я до сих пор понять не могу, можете мне объяснить, прочему оно работает.
Отслеживать
565 2 2 серебряных знака 16 16 бронзовых знаков
задан 4 мая 2022 в 22:05
Юрий Венгер Юрий Венгер
3 1 1 бронзовый знак
В некоторых случаях (лучше всегда, для чистоты кода) функции стоит указать принудительно (прописать return), что надо непросто вполнить код, но и вернуть его результат в место вызова функции. Прочитайте больше про сам return, поднятие переменных и области видимости перменных.
4 мая 2022 в 22:43
Странный вопрос. Вы хотите, чтобы функция вернула вычисленное значение, но удивляетесь ‘undefined’, когда лишаете ее такой возможности. Представьте первый вызов peristence(). Если вычисленное значение > 9, то будет следующий рекурсивный вызов, но для текущего вызова это последняя инструкция, и если явно ничего не вернуть, то получим undefined.
4 мая 2022 в 23:03
Всем спасибо! Разобрался.
5 мая 2022 в 5:53
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Чтоб понять, что идет не так в функции persistence давайте мысленно её продебажим:
- Подадим ей на вход число 25.
- После цикла в newNum будет число 10
- 10 больше 9, значит мы будем делать persistence(newNum);
- Далее мы снова попадаем в нашу функцию, на вход пришло 10
- Считаем произведение, получаем 0
- 0 меньше, чем 9, тогда мы возвращаем 0
- Вернулись к первому вызову.
И тут вы должны были понять, где проблема. Когда мы вернулись обратно, мы никуда не присвоили значение, полученное из функции.
Мало того, далее мы просто вышли из неё т.к. после вызова persistence(newNum); нет никакого кода.
Однако что же тогда вернет наша функция? А ничего она не вернет, что вы и получили.
Во втором же варианте, когда в newNum хранится число больше 9, оно в любом случае вернет его обратно и так, обратной рекурсией дойдет до места, где вы вызывали функцию.
На случай, если вы всё еще не поняли в чем проблема, попробуйте посидеть с дебагером, поэтапно разбирая что делает код (рекомендую взять число 999 т.к. там много итераций, где можно посмотреть на работу программы и число 24 т.к. там будет всего 1 итерация)
return
Оператор return завершает выполнение текущей функции и возвращает её значение.
Интерактивный пример
Синтаксис
return [[выражение]];
Выражение, значение которого будет возвращено. Если не указано, вместо него возвращается undefined .
Описание
При вызове оператора return в функции её выполнение прекращается. Указанное значение возвращается в место вызова функции. Например, приведённая ниже функция возвращает возведённое в квадрат значение своего аргумента, x (где x – это число):
function square(x) return x * x; > var demo = square(3); // значение demo будет равняться 9
Если возвращаемое значение не указано, вместо него возвращается undefined .
Следующие выражения всегда прерывают выполнение функции:
return; return true; return false; return x; return x + y / 3;
Автоматическая расстановка точек с запятыми
На выражение return влияет автоматическая расстановка точек с запятыми (ASI). Разрыв строки не допускается между ключевым словом return и выражением.
return a + b;
трансформируется ASI в:
return; a + b;
В консоли появится предупреждение «unreachable code after return statement».
Примечание: Начиная с Gecko 40, предупреждение в консоли появляется, если обнаружен недостижимый код после return .
Для того, чтобы избежать данной проблемы (предотвратить ASI), можно использовать скобки:
return ( a + b; );
Примеры
Прерывание функции
Функция немедленно останавливается в точке, где вызывается return .
function counter() for (var count = 1; ; count++) // бесконечный цикл console.log(count + "A"); // до 5 if (count === 5) return; > console.log(count + "B"); // до 4 > console.log(count + "C"); // никогда не появляется > counter(); // Выводит: // 1A // 1B // 2A // 2B // 3A // 3B // 4A // 4B // 5A
Возвращение функции
Смотрите также статью о замыканиях.
function magic(x) return function calc(x) return x * 42; >; > var answer = magic(); answer(1337); // 56154
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-return-statement |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
Для чего нужен return?
Возможно, я невероятно глупый человек (хоть я себя таковым и не считаю), но хоть убейте не могу понять, что делает запись «return 0», «return *какая-то переменная*» и т.д.
Смотрю видео-обучение и там человек написал вот такой код
#include void print (float number) < printf ("Your number is %.2f\n", number); >float del (float a, float b) < float res; if (b != 0) res = a / b; else res = 0; return res; >int main ()
Читал вопросы других людей, и все равно не могу понять. Как я понял, одна из функций записи return — это остановка данной функции (это если написать 0).
Но что делает «return res» во втором куске кода? То есть в переменную res записывается деление числа А и Б. А потом оно куда-то там возвращается.. (Я чайник тот еще, поэтому если можете объяснить, то как можно понятнее). Спасибо.
- Вопрос задан более трёх лет назад
- 7320 просмотров
2 комментария
Простой 2 комментария
