← Назад к вопросам

Всегда ли функция возвращает что-либо в JavaScript

2.0 Middle🔥 72 комментариев
#HTML и CSS

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Всегда ли функция возвращает что-либо в JavaScript

Ответ: Нет, не всегда явно. В JavaScript каждая функция всегда возвращает значение, даже если вы не написали return. Однако это значение может быть undefined (явное отсутствие значения).

Это важная и часто неправильно понимаемая особенность JavaScript.

Два типа возврата

1. Явный возврат (явное значение)

Вы используете оператор return с значением.

function add(a, b) {
  return a + b; // Явно возвращает сумму
}

console.log(add(5, 3)); // 8

2. Неявный возврат (undefined)

Функция завершилась без оператора return.

function greet(name) {
  console.log('Hello, ' + name); // Что-то делает
  // Нет return -> возвращает undefined
}

console.log(greet('John')); // undefined
// console.log вывел: "Hello, John"
// А sам greet(...) вернул undefined

Различие между эффектом и возвращаемым значением

Это критичное понимание:

// Функция МОЖЕТ что-то делать (побочный эффект)
// и возвращать значение

function processData(data) {
  console.log('Processing:', data); // Побочный эффект
  localStorage.setItem('data', data); // Еще побочный эффект
  // Но что она возвращает?
  // undefined!
}

const result = processData('test');
console.log(result); // undefined

// ---

// Правильный подход: возвращать результат
function processDataCorrectly(data) {
  console.log('Processing:', data);
  const processed = data.toUpperCase();
  return processed; // Явно возвращаем результат
}

const result = processDataCorrectly('test');
console.log(result); // 'TEST'

Явный return vs неявный

// Пример 1: функция, которая возвращает значение
function multiply(a, b) {
  return a * b;
}
console.log(multiply(4, 5)); // 20

// Пример 2: функция, которая что-то делает, но не возвращает значение
function logMultiply(a, b) {
  const result = a * b;
  console.log('Result:', result); // Выводит в консоль
  // return не указан -> возвращает undefined
}
console.log(logMultiply(4, 5)); // undefined
// (но в консоли было выведено "Result: 20")

// Пример 3: функция с пустым return
function doNothing() {
  console.log('Doing something');
  return; // return без значения -> возвращает undefined
}
console.log(doNothing()); // undefined

Все варианты возврата

Вариант 1: Явный return с значением

function getValue() {
  return 42;
}
console.log(getValue()); // 42

Вариант 2: return без значения (возвращает undefined)

function noValue() {
  return;
}
console.log(noValue()); // undefined

Вариант 3: Нет return (функция завершилась, возвращает undefined)

function noReturn() {
  const x = 5;
}
console.log(noReturn()); // undefined

Вариант 4: return null (явное отсутствие значения)

function returnNull() {
  return null;
}
console.log(returnNull()); // null

Вариант 5: return object/array/function

function getObject() {
  return { name: 'John', age: 30 };
}
console.log(getObject()); // { name: 'John', age: 30 }

Практические примеры

Пример 1: Array методы

// Array.map() — фильтрует элементы
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(n => {
  return n * 2; // Явный return
});
console.log(doubled); // [2, 4, 6, 8]

// Стрелочная функция: неявный return
const doubled2 = numbers.map(n => n * 2);
console.log(doubled2); // [2, 4, 6, 8]

Пример 2: forEach (не возвращает, только выполняет)

const result = [1, 2, 3].forEach(n => {
  console.log(n * 2);
});
console.log(result); // undefined
// forEach — это функция для побочных эффектов, не для сбора результата

// Правильное использование: используй map для сбора результата
const result = [1, 2, 3].map(n => n * 2);
console.log(result); // [2, 4, 6]

Пример 3: Функция обработки ошибок

function findUser(id) {
  const users = [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }];
  const user = users.find(u => u.id === id);
  
  if (!user) {
    return null; // Явно возвращаем null, если не найден
  }
  
  return user; // Возвращаем найденного пользователя
}

console.log(findUser(1)); // { id: 1, name: 'John' }
console.log(findUser(99)); // null

undefined vs null

undefined — это значение по умолчанию, которое JavaScript присваивает:

  • Функции, которые не вернули ничего
  • Переменным, которые объявлены, но не инициализированы
  • Параметрам функции, которые не были переданы

null — это значение, которое ВЫ явно присваиваете, чтобы обозначить отсутствие значения.

let x;
console.log(x); // undefined (не инициализирована)

let y = null;
console.log(y); // null (явно задано как отсутствие)

function test(param) {
  console.log(param); // undefined, если не передан
}
test(); // undefined

function test2(param = 'default') {
  console.log(param); // 'default'
}
test2(); // 'default'

Важный паттерн: ранний возврат (Early Return)

// ❌ Плохо: глубокая вложенность
function processUser(user) {
  if (user) {
    if (user.isActive) {
      if (user.age >= 18) {
        return 'User is eligible';
      } else {
        return 'User is too young';
      }
    } else {
      return 'User is not active';
    }
  } else {
    return 'User not found';
  }
}

// ✅ Хорошо: ранний возврат
function processUser(user) {
  if (!user) return 'User not found';
  if (!user.isActive) return 'User is not active';
  if (user.age < 18) return 'User is too young';
  return 'User is eligible';
}

Асинхронные функции и return

Асинхронная функция ВСЕГДА возвращает Promise

// Даже если ты не пишешь return
async function fetchData() {
  console.log('Fetching...');
  // Нет return -> возвращает Promise<undefined>
}

fetchData().then(result => {
  console.log(result); // undefined
});

// ---

// С return
async function fetchData() {
  const data = await fetch('/api/data');
  return data.json(); // Возвращает Promise<JSON>
}

fetchData().then(result => {
  console.log(result); // { ...данные... }
});

Таблица: Что возвращает функция в разных случаях

КодВозвращает
function f() {}undefined
function f() { return; }undefined
function f() { return 5; }5
function f() { return null; }null
function f() { return {}; }{}
async function f() {}Promise<undefined>
async function f() { return 5; }Promise<5>
() => 5 (стрелочная)5
() => { return 5; }5
() => { 5; }undefined

Важные выводы

  1. Каждая функция возвращает значение — либо явное (через return), либо undefined

  2. Функция vs побочный эффект

    • Функция может выводить что-то в консоль, менять DOM, но это не возвращаемое значение
    • Возвращаемое значение — это только то, что в return
  3. undefined != null

    • undefined — значение по умолчанию (не инициализирована)
    • null — явное обозначение отсутствия (ты сам написал null)
  4. Стрелочные функции

    • () => 5 — неявный return значения 5
    • () => { return 5; } — явный return 5
    • () => { 5; } — return undefined
  5. Асинхронные функции всегда возвращают Promise

    • Даже если в них нет return, они возвращают Promise<undefined>

Вывод

В JavaScript нет функций, которые "ничего не возвращают". Функция ВСЕГДА возвращает значение. Вопрос в том, что это значение: явно заданное (через return) или undefined по умолчанию.

Это критичное понимание помогает писать правильный код и избегать ошибок при работе с результатами функций.

Всегда ли функция возвращает что-либо в JavaScript | PrepBro