использование 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 то никакого результата бы видно не было бы, до тех пор, пока этот самый результат где-либо не отобразить.

→ Ссылка
Автор решения: eccs0103

Объяснение

То, что 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 в консоли.

→ Ссылка
Автор решения: Alex Krass

Возврат значения, это то, что останется на месте функции после её выполнения. В вашем примере 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"); }

Поэтому просто представьте, что возвращаемое значение - результат, который останется в коде на месте функции, после её выполнения.

→ Ссылка