Что такое функция

Что такое функция

Почему функции - фундамент программирования

Функция в JavaScript - это именованный или безымянный блок кода, который можно вызывать много раз. Она помогает убрать дублирование, сделать код компактнее и разбить большую задачу на понятные части.

Ключевой момент: функция превращает повторяемую логику в переиспользуемый инструмент.

Проверь себя: почему один общий calculateTotal лучше, чем одинаковый расчет в пяти местах?

Базовая идея функции

Функция принимает входные данные (параметры), выполняет логику и возвращает результат.

function getStatus(score) {
  if (score >= 70) return 'passed';
  return 'retry';
}

console.log(getStatus(80));

Смотри, что важно: один и тот же код работает с разными входами.

Функции могут быть без аргументов

Аргументы не обязательны. Если функции не нужны внешние данные, она может работать без параметров.

function getAppVersion() {
  return '1.0.0';
}

console.log(getAppVersion());

Такой формат полезен, когда функция возвращает фиксированное значение или инкапсулирует действие без входа.

Проверь себя: в чем разница между "функция без аргументов" и "функция с аргументами, которые не передали"?

Смотри, что важно:

  • если у функции нет параметров, она просто не ожидает именованных входов (лишние аргументы можно передать, но они не попадут ни в один параметр; при необходимости их можно собрать через rest-параметр или arguments);
  • если у функции есть параметры, но аргумент не передали, соответствующий параметр станет undefined.
function noParams() {
  return 'ok';
}

function oneParam(name) {
  return name === undefined ? 'Привет, гость!' : `Привет, ${name}!`;
}

console.log(noParams(123)); // ok
console.log(oneParam()); // Привет, гость!

Как работает вызов функции

Функция выполняется только в момент вызова. Объявление само по себе код внутри не запускает.

function greet(name) {
  console.log(`Привет, ${name}`);
}

greet('Анна');
greet('Илья');

Каждый вызов - это отдельное выполнение с текущими аргументами.

Что делает return

return завершает выполнение функции и отдает значение наружу.
Если return не указан, функция возвращает undefined.

function sum(a, b) {
  return a + b;
}

function logOnly(text) {
  console.log(text);
}

console.log(sum(2, 3)); // 5
console.log(logOnly('hello')); // undefined

Смотри, что важно: любой код после return в той же ветке уже не выполнится.

Возвращаемое значение можно присваивать переменной

Результат вызова функции - это обычное значение JavaScript. Его можно сохранить в переменную и использовать дальше в вычислениях.

function calcTotal(price, tax) {
  return price + tax;
}

const total = calcTotal(100, 20);
console.log(total); // 120

Это базовый и самый частый сценарий: функция возвращает значение, а вызывающий код решает, что с ним делать дальше.

Функция как "контракт"

У функции есть контракт:

  • что принимает;
  • что возвращает;
  • какие правила внутри.

Чем понятнее контракт, тем проще использовать функцию в других модулях без багов.

function formatPrice(value) {
  return `${value} ₽`;
}

Где функции встречаются в реальном коде

  • валидация формы (validateEmail);
  • преобразование данных API (normalizeUser);
  • вычисления (calculateDiscount);
  • обработчики событий (handleSubmit).

Мини-сценарий:

function canOpenLesson(isAuth, isPublished) {
  return isAuth && isPublished;
}

Такую функцию можно использовать в UI, в тестах и в серверной логике с одинаковым поведением.

Функция и читаемость

Функции помогают дать имя логике.

Плохо:

const status = score >= 70 && hasAttempt ? 'passed' : 'retry';

Лучше:

function getLessonStatus(score, hasAttempt) {
  if (!hasAttempt) return 'retry';
  return score >= 70 ? 'passed' : 'retry';
}

Здесь часто путаются: "короче" не всегда значит "лучше". Названная функция часто выигрывает по читаемости.

Проверь себя: что проще отлаживать через месяц - выражение в одну строку или отдельную функцию с именем?

Частые ошибки новичков

  • Писать функцию, которая делает слишком много разных задач.
  • Забывать return и получать undefined.
  • Давать неинформативные имена (doIt, processData).
  • Сильно зависеть от внешних переменных вместо параметров.

Анти-провал: одна функция - одна понятная ответственность.

Что будет, если изменить входные данные

В getStatus:

  • 80 -> passed;
  • 69 -> retry.

Если случайно передать строку '80', результат может быть корректным из-за приведения, но такой код становится хрупким. Лучше нормализовать входы явно.

Проверь себя: где лучше проверять тип входа - внутри функции или до вызова?

Краткий итог

  • Функция - переиспользуемый блок логики.
  • Она принимает вход, выполняет действие и возвращает результат.
  • Функции уменьшают дублирование и улучшают читаемость.
  • Хороший контракт функции делает код стабильнее и проще для тестов.
  • Осознанная декомпозиция на функции - один из главных навыков разработчика.