использование return в функциях
коллеги, помогите начинающему разработчику, я уже убил полдня пытаясь уловить суть ретёрна. Читаю документацию вроде бы всё понятно, но суть ускользает. Ретёрн возвращает результат функции, но например в этом простом коде если я убираю ретёрн, мне функция возвращает то что мне нужно. вопрос - Зачем он тогда нужен? если без него мне тоже все что нужно возвращается?)
let a = 2;
let b = 3;
function sumNumbers () {
return console.log(a+b);
}
sumNumbers();
Ответы (3 шт):
если я убираю ретёрн, мне функция возвращает то что мне нужно
Нет, функция вернёт undefined. Просто этого не видно, т.к. возвращаемым значением в коде никак не оперируется. А если написать
console.log(sumNumbers());
то в консоли будет ещё выведена эта строчка.
В текущем случае работа что с return, что без него одинакова только по одной причине: в внутри исполняется функция console.log, которая печатает информацию в консоль, т.е. в некий output. А если бы внутри было бы написано например return a+b то никакого результата бы видно не было бы, до тех пор, пока этот самый результат где-либо не отобразить.
Объяснение
То, что a + b печатается в консоль, ещё не значит, что функция возвращает нужное вам значение. Чтобы проверить, сделаем так:
function sumNumbers() {
return console.log(2 + 3);
}
let result = sumNumbers();
console.log(result);
5 и undefined. 5 выводится, потому что мы писали console.log(2 + 3), а undefined - потому что console.log не возвращает значения.
Более хорошее объяснение
Чтобы лучше понять, как работает return скажу так:
То значение, которое получается справа от return занимает место вызова функции после его выполнения. К примеру:
function foo1() {
return 1 + 2;
}
function foo2() {
console.log(foo1());
return;
}
foo2();
Что произойдет, когда программа объявит функции foo1, foo2 и вызовет foo2?
Конечно все происходит немного иначе, чем я сейчас покажу, но для ясности представим так. Там, где вызвана функция встают инструкции в теле функции. То есть после простого преобразования получим:
function foo1() {
return 1 + 2;
}
{
console.log(foo1());
return;
}
Дальше, в log так же вызвана функция. Эту часть так же разберем:
{
console.log(
{
return 1 + 2;
}
);
return;
}
Теперь вызовов больше нет. Начинаются выполнения инструкций. Вместо 1 + 2 у нас встает 3. Получается return 3. А как уже сказал, значение справа от return встает место функции. То есть получаем:
{
console.log(3);
return;
}
Дальше console.log(3); выводит в консоль 3 и ставит свое возвращаемое значение, а у нее отсутствует возвращаемое значение. Если значение отсутствует, то можно считать, что значение - undefined. То есть отсутствие значения и undefined это одно и то же. Значит получим:
{
undefined;
return;
}
а в консоли 3. А так как undefined из себя не представляет инструкцию, то его выполнение ни к чему не приводит.
Дальше return;. И у return справа отсутствует значение, значит после выполнения функции на его месте так же будет стоять undefined. И этот undefined так же ничего не сделает, так что мы получим всего лишь 3 в консоли.
Возврат значения, это то, что останется на месте функции после её выполнения. В вашем примере console.log - печать результата в вывод консоли, он к возврату значения отношения не имеет.
Другой пример, есть обычные переменные, которым можно присвоить результат.
let a = 10;
let b = "Hello";
Вопрос, что будет записано в переменную c результате следующего кода?
let c = sumNumbers();
Примеры:
function sumNumbers() { return 10; }
let c = sumNumbers(); // let c = sumNumbers() превратится в let c = 10
function sumNumbers() { return "Hello"; }
let c = sumNumbers(); // let c = sumNumbers() превратится в let c = "Hello"
function sumNumbers() { return [1,2,3]; }
let c = sumNumbers(); // let c = sumNumbers() превратится в let c = [1,2,3]
Далее, функция без return возвращает undefined и сама функция console.log() возвращает undefined, поэтому код:
function sumNumbers() { return console.log("ok"); }
let c = sumNumbers(); // let c = sumNumbers() превратится в let c = undefined
и код
function sumNumbers() { console.log("ok"); }
let c = sumNumbers(); // let c = sumNumbers() превратится в let c = undefined
одинаковы, их не имеет смысла рассматривать как возвращаемое значение.
Или другой пример
function isTrue() { return true; }
if (isTrue()) { console.log("ok"); }
превратится в
if (true) { console.log("ok"); }
Поэтому просто представьте, что возвращаемое значение - результат, который останется в коде на месте функции, после её выполнения.