Аргументы и результат функции
В прошлом уроке функция была кофемашиной. Её параметры — отсеки, аргументы — то, что вы в них засыпаете, а return наливает напиток в чашку. Теперь разберём вопросы, которые эта картинка поднимает сама.
Что будет, если засыпать зёрна, но забыть про воду? Или принести три пакета зёрен на два отсека? И что окажется в чашке, если программа машины ничего в неё не налила?
Сколько аргументов передавать
Число аргументов в вызове не обязано совпадать с числом параметров. Аргументы заполняют параметры по порядку, слева направо. Давайте посмотрим на функцию с двумя параметрами и три вызова:
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.
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Давайте разберём по шагам:
pair(5, 6)печатает5 6, ноreturnв ней нет, поэтому вresultпопадаетundefined.half(10)доходит доreturn n / 2и отдаёт5.- Строка
console.log("never")не выполняется ни разу:returnзавершает вызов сразу. 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:
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 и подпишись на канал — откроются все уроки.