Оператор return

return завершает выполнение функции и возвращает указанное значение вызвавшему коду; без return (или с пустым return) функция возвращает undefined.

Зачем нужно

return — единственный способ передать результат вычислений из функции наружу. Правильное использование return делает функции предсказуемыми (чистыми) и упрощает их тестирование. Ранний return (guard clause) позволяет избегать глубокой вложенности условий.

Где используется

  • В любой функции, возвращающей вычисленное значение
  • Ранний выход из функции при невыполнении предусловий
  • В функциях-конструкторах (возврат объекта)
  • В генераторах (совместно с yield)

Базовое использование

function add(a, b) {
  return a + b; // возвращает число
}

function greet(name) {
  return `Привет, ${name}!`; // возвращает строку
}

function doSomething() {
  // нет return → возвращает undefined
}

console.log(add(2, 3));         // 5
console.log(greet('Иван'));     // 'Привет, Иван!'
console.log(doSomething);     // undefined

Ранний return (Guard Clause)

Паттерн «страж» улучшает читаемость, уменьшая вложенность:

// Плохо: глубокая вложенность
function processUser(user) {
  if (user) {
    if (user.isActive) {
      if (user.hasPermission) {
        return doWork(user);
      }
    }
  }
  return null;
}

// Хорошо: ранний return
function processUser(user) {
  if (!user) return null;
  if (!user.isActive) return null;
  if (!user.hasPermission) return null;

  return doWork(user); // основная логика без вложенности
}

return в функции-конструкторе

function Person(name) {
  this.name = name;
  // return без объекта игнорируется — возвращается this
}

function createPerson(name) {
  return { name }; // явный return объекта — new вернёт этот объект
}

const p1 = new Person('Анна');    // { name: 'Анна' }
const p2 = new createPerson('Иван'); // { name: 'Иван' }

function bad(name) {
  this.name = name;
  return 42; // примитив — игнорируется при new, возвращается this
}
const b = new bad('X'); // { name: 'X' }, не 42

return в стрелочных функциях

// Явный return с фигурными скобками
const double = (n) => { return n * 2; };

// Неявный return — без фигурных скобок
const double2 = (n) => n * 2;

// Возврат объекта — нужны скобки!
const makeObj = (x) => ({ value: x }); // OK
const broken  = (x) => { value: x };   // undefined — воспринимается как блок

return и автоматическая вставка точки с запятой (ASI)

// Опасно: JS вставит ; после return
function getObject() {
  return
  {           // эта строка никогда не выполнится
    value: 1
  };
}

console.log(getObject); // undefined!

// Правильно: открывающая скобка на той же строке
function getObject() {
  return {
    value: 1
  };
}

Частые ошибки

1. Забытый return в функции, использующей результат

function multiply(a, b) {
  a * b; // результат вычислен, но не возвращён
}

console.log(multiply(3, 4)); // undefined, не 12

2. Несколько точек выхода без явного намерения

function getDiscount(user) {
  if (user.isPremium) return 0.2;
  if (user.isNew) return 0.1;
  // Неявный return undefined — может удивить
}
// Лучше: явный return 0 в конце

3. return в forEach не прерывает цикл

[1, 2, 3].forEach(n => {
  if (n === 2) return; // выходит только из коллбэка, не из forEach
  console.log(n); // 1, 3 — 2 пропущена, но цикл продолжается
});
// Для прерывания используй for...of или Array.prototype.some

Связанные темы

Ресурсы