Параметры функций
Параметры функций
Почему параметры делают функцию полезной
Без параметров функция обычно привязана к одному набору данных. Параметры позволяют передавать разные входы и использовать одну и ту же логику в десятках сценариев.
Ключевой момент: параметры превращают функцию из "разового скрипта" в переиспользуемый инструмент.
Проверь себя: почему 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.
Это предсказуемое поведение, которое защищает систему от неожиданных вычислений.
Краткий итог
- Параметры делают функции гибкими и переиспользуемыми.
- Важно различать параметры (определение) и аргументы (вызов).
- Порядок и тип аргументов напрямую влияют на корректность результата.
- Значения по умолчанию упрощают работу с опциональными входами.
- Осознанная работа с параметрами снижает число скрытых логических багов.