Перейти к содержимому
Теория · Функции · урок 2 из 10

Аргументы и результат функции

В прошлом уроке функция была кофемашиной. Её параметры — отсеки, аргументы — то, что вы в них засыпаете, а return наливает напиток в чашку. Теперь разберём вопросы, которые эта картинка поднимает сама.

Что будет, если засыпать зёрна, но забыть про воду? Или принести три пакета зёрен на два отсека? И что окажется в чашке, если программа машины ничего в неё не налила?

Сколько аргументов передавать

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

JavaScript
function pair(a, b) {
    console.log(a, b);
}

pair(1); // 1 undefined
pair(1, 2, 3); // 1 2
console.log(2 + undefined); // NaN

Разберём, что получилось в каждом случае.

Аргументов меньше

Вызов pair(1) кладёт 1 в a, а для b аргумента не хватило. Параметр без аргумента получает undefined. Так и печатается строка 1 undefined.

В арифметике undefined превращается в NaN. Поэтому пропущенный аргумент в сумме даёт NaN, а не 0: третья строка 2 + undefined печатает NaN.

Аргументов больше

Вызов pair(1, 2, 3) кладёт 1 в a и 2 в b. Лишний аргумент функция отбрасывает: параметра для него нет. Печатается 1 2.

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

Результат без return

Значение вызова — то, что функция отдала через return. Если return в теле нет, программа машины отработала, а чашка осталась пустой. Пустая чашка в JavaScript — это undefined.

JavaScript
const result = pair(5, 6); // 5 6
console.log(result); // undefined

function half(n) {
    if (n < 0) {
        return;
    }
    return n / 2;
    console.log("never");
}

console.log(half(10), half(-4)); // 5 undefined

Давайте разберём по шагам:

  1. pair(5, 6) печатает 5 6, но return в ней нет, поэтому в result попадает undefined.
  2. half(10) доходит до return n / 2 и отдаёт 5.
  3. Строка console.log("never") не выполняется ни разу: return завершает вызов сразу.
  4. half(-4) попадает в if и выполняет return без значения. Такой return тоже отдаёт undefined.

Печать и возврат — разные вещи. console.log показывает значение на экране, а return передаёт его тому, кто вызвал функцию.

Напечатанное значение можно только прочитать глазами. С возвращённым значением программа работает дальше:

  • сохраняет его в константе: const h = half(10);
  • подставляет в выражение: half(10) + 1 даёт 6;
  • передаёт аргументом в другой вызов: half(half(20)) даёт 5.

Поэтому функция, которая считает, возвращает результат, а печатает его тот, кто её вызвал.

Этот вопрос часто задают на собеседовании: «Что возвращает функция без return?» Ответ — undefined, и то же самое даёт return без значения.

Частая ошибка

Функцию написали, чтобы она считала, но забыли return:

JavaScript
function total(price, count) {
    price * count; // ✗
}

console.log(total(3, 4)); // undefined

Функция умножает 3 на 4, но результат никуда не уходит, и вызов отдаёт undefined. Ошибки JavaScript не сообщает. Исправление — вернуть значение: return price * count;.

Главное

  • Аргументы заполняют параметры слева направо.
  • Параметр без аргумента получает undefined, а лишний аргумент отбрасывается.
  • Функция без return или с пустым return возвращает undefined.
  • return завершает вызов: строки после него не выполняются.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом