Оператор 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
Связанные темы
- Функции -- именование и лучшие практики
- Параметры и аргументы
- Функции, возвращающие функции
- _MOC Функции
- _MOC JavaScript