Параметры функций

Параметры функций

Почему параметры делают функцию полезной

Без параметров функция обычно привязана к одному набору данных. Параметры позволяют передавать разные входы и использовать одну и ту же логику в десятках сценариев.

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

Проверь себя: почему greet(name) лучше, чем отдельные функции greetAnna, greetMax?

Параметры и аргументы

  • параметр - имя в определении функции;
  • аргумент - конкретное значение при вызове.
function greet(name) { // name - параметр
  return `Привет, ${name}`;
}

console.log(greet('Anna')); // 'Anna' - аргумент

Смотри, что важно: порядок аргументов должен соответствовать параметрам.

Несколько параметров

function calcDiscount(price, percent) {
  return price - (price * percent) / 100;
}

Если перепутать аргументы местами, получишь логическую ошибку без синтаксического падения.

Проверь себя: что вернет calcDiscount(10, 2000) и почему это плохо для бизнес-логики?

Параметры по умолчанию

function createUser(name, role = 'student') {
  return { name, role };
}

console.log(createUser('Ira')); // role = 'student'

Значения по умолчанию полезны, когда часть входа опциональна.

Смотри, что важно: дефолт используется, если аргумент undefined.

console.log(createUser('Ira', undefined)); // role = 'student'
console.log(createUser('Ira', null)); // role = null (дефолт не сработает)

null в этом случае считается «явно переданным значением», поэтому дефолт не применяется.

Проверка параметров

В реальных сценариях входы часто приходят "грязными".

function safeDivide(a, b) {
  if (typeof a !== 'number' || typeof b !== 'number') return null;
  if (b === 0) return null;
  return a / b;
}

Смотри, что важно: typeof x === 'number' не защищает от NaN и Infinity (они тоже имеют тип number).

Если тебе нужно принимать только «обычные числа», чаще используют Number.isFinite(...):

function safeDivide2(a, b) {
  if (!Number.isFinite(a) || !Number.isFinite(b)) return null;
  if (b === 0) return null;
  return a / b;
}

Анти-провал: если функция на границе модуля, добавляй базовую валидацию параметров.

Мини-сценарий: статус шага

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

Здесь два параметра описывают реальные входные условия.

Если параметров станет слишком много, это сигнал подумать о передаче объекта.

Например так проще не перепутать порядок:

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

Смотри, что важно: если вызвать getStepStatus2() без аргумента, будет ошибка (нельзя деструктурировать undefined). Если параметр может быть пропущен, добавляют дефолт и/или значения по умолчанию для полей:

function getStepStatus3({ score = 0, hasAttempt = false } = {}) {
  if (!hasAttempt) return 'not-started';
  return score >= 70 ? 'passed' : 'retry';
}

Остаточные параметры (rest)

Иногда количество аргументов заранее неизвестно. Тогда используют rest-параметр ... - он собирает "остаток" аргументов в массив.

Исторически для этого использовали arguments (псевдомассив в обычных function), но сейчас чаще предпочитают rest: это настоящий массив и он работает в стрелочных функциях.

function sumAll(...numbers) {
  let total = 0;
  for (const n of numbers) total += n;
  return total;
}

console.log(sumAll(1, 2, 3)); // 6

Смотри, что важно: rest-параметр должен быть последним в списке параметров.

function log(label, ...values) {
  console.log(label, values);
}

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

  • Путать порядок аргументов.
  • Не учитывать undefined при пропущенных аргументах.
  • Передавать данные "не того типа" без проверки.
  • Держать слишком длинный список параметров (5+), ухудшая читаемость.

Проверь себя: когда лучше перейти от списка параметров к одному объекту с полями?

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

В safeDivide:

  • (10, 2) -> 5;
  • (10, 0) -> null;
  • ('10', 2) -> null.

Это предсказуемое поведение, которое защищает систему от неожиданных вычислений.

Краткий итог

  • Параметры делают функции гибкими и переиспользуемыми.
  • Важно различать параметры (определение) и аргументы (вызов).
  • Порядок и тип аргументов напрямую влияют на корректность результата.
  • Значения по умолчанию упрощают работу с опциональными входами.
  • Осознанная работа с параметрами снижает число скрытых логических багов.