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

Пока наши функции при каждом вызове делали ровно одно и то же. Гораздо полезнее функция, которая умеет работать с разными данными – например, приветствовать любого, чьё имя ей передали:

greet.jsjs
function greet(name) {  console.log(`Привет, ${name}!`);}greet('Ира');greet('Макс');
Консоль
Привет, Ира!
Привет, Макс!
Одно тело – разные приветствия: имя каждый раз приходит из скобок вызова.

Данные для функции

Параметр – имя в круглых скобках объявления. Внутри тела он работает как переменная: значение параметра можно печатать, подставлять в выражения, сравнивать. Отличие от обычной переменной одно: значение не записано в коде заранее – параметр получает его снаружи, при вызове. У greet параметр один – name:

Аргумент – значение в скобках вызова. Именно оно ложится в параметр на время вызова:

double.jsjs
function double(x) {  console.log(x * 2);}// аргумент – число 21: в x легло 21double(21);// другой вызов – другой аргументdouble(4);
Консоль
42
8

Коротко: параметр – имя в объявлении, аргумент – значение при вызове. Параметр ведёт себя как знакомая локальная переменная: существует только внутри функции. Разница лишь в том, что начальное значение он получает из аргумента при вызове:

Параметр создаётся при каждом вызове
function greet(name) {
Объявление: у greet один параметр – name. Тело пока не выполняется.
console.log(`Привет, ${name}!`);
}
greet('Ира');
greet('Макс');

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

У функции может быть несколько параметров – их перечисляют через запятую. Аргументы подставляются по порядку: первый – в первый параметр, второй – во второй:

repeat-word.jsjs
function repeatWord(word, times) {  for (let i = 1; i <= times; i++) {    console.log(word);  }}repeatWord('эхо', 3);
Консоль
эхо
эхо
эхо
Первый аргумент лёг в word, второй – в times: значения раскладываются по порядку.

Если аргументы не совпали с параметрами

А что будет, если передать больше аргументов, чем параметров? Ошибки не случится: первый аргумент попадёт в name, а для второго здесь нет параметра, поэтому функция его не использует:

extra-arg.jsjs
function greet(name) {  console.log(`Привет, ${name}!`);}// второй аргумент функция здесь не используетgreet('Ира', 'Макс');
Консоль
Привет, Ира!

Меньше – тоже не ошибка. Аргумент не передали? Параметр всё равно будет создан – со значением undefined:

missing-arg.jsjs
function greet(name) {  console.log(`Привет, ${name}!`);}greet();
Консоль
Привет, undefined!

Печатать «Привет, undefined!» гостю без имени не хочется. Для этой проблемы у объявления есть решение: параметру задают значение по умолчанию – через =. Оно используется, если аргумент не передан или передан undefined:

default.jsjs
function greet(name = 'гость') {  console.log(`Привет, ${name}!`);}// аргумент есть – в name легло 'Ира'greet('Ира');// аргумента нет – в name легло 'гость'greet();// передан undefined – в name снова 'гость'greet(undefined);
Консоль
Привет, Ира!
Привет, гость!
Привет, гость!

Аргументом может быть выражение

До сих пор мы писали значения прямо в вызове. Но аргументом может быть и переменная, и целое выражение. Сначала JavaScript вычисляет его, а уже полученное значение передаёт функции:

Выражение вычисляется до передачи
function withDelivery(price) {
console.log(price + 300);
}
const basket = 1200;
В переменную basket легло 1200.
withDelivery(basket);
withDelivery(500 + 250);

// теперь вы знаете

  1. Параметр – имя в объявлении, аргумент – значение при вызове
  2. Параметр – переменная вызова: создаётся заново и живёт только внутри тела
  3. Аргументом может быть переменная или выражение – передаётся вычисленное значение
  4. Аргументы ложатся в параметры по порядку: лишние игнорируются, недостающие дают undefined
  5. name = 'гость' в объявлении – значение по умолчанию для пропущенного аргумента

Проверьте себя

В записи greet('Ира') строка 'Ира' – это…

Что окажется в параметре age?

function profile(name, age) {
console.log(name, age);
}
profile('Ира');

Что напечатает программа?

function double(x) {
console.log(x * 2);
}
const n = 5;
double(n + 3);

Объявлено function hello(name = 'друг'), тело печатает «Привет, » и имя. Что напечатает вызов hello()?

Верно ли, что к параметру name можно обратиться и после вызова – снаружи функции?

переключают уроки · не работают при фокусе в полях ввода