Функции: объявление и вызов
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Функция — это кусок кода, которому дали имя. Один раз описали действие через function — и дальше вызываете его по имени столько раз, сколько нужно, вместо того чтобы переписывать одно и то же.
Программа почти всегда делает одно и то же по многу раз: поздороваться с пользователем, посчитать цену, показать сообщение об ошибке. Если каждый раз выписывать эти строки заново, код растёт, а править приходится во всех местах сразу — и одно место обязательно забудется.
Функция решает обе беды сразу. Она собирает действие в одном месте и даёт ему имя, а имя — это уже язык, на котором удобно думать: не «склей три строки», а «поздоровайся».
Захотели поменять формулировку — правите одну строку внутри функции, и меняется везде. Это и есть главная выгода: у поведения появился один хозяин.
Самый привычный способ создать функцию — объявление. Оно состоит из четырёх частей подряд: ключевое слово function, имя, круглые скобки (в них перечисляют параметры, но их может и не быть) и тело в фигурных скобках.
Обратите внимание: сам факт объявления ничего не печатает. Тело — это записанный рецепт, а не приготовленное блюдо. Движок запоминает его под именем sayHello и ждёт, когда его позовут.
Объявления функций движок находит и «поднимает» ещё до выполнения кода — этот механизм называют всплытием (hoisting). Поэтому такой порядок работает, хотя выглядит странно.
Работает — но читателю кода от этого не легче. Привычка объявлять раньше, чем вызывать, экономит нервы вам же через месяц. Сам механизм и его разницу с переменными разбирает статья «Всплытие и временная мёртвая зона».
Вызов — это имя функции плюс круглые скобки. Именно скобки запускают тело; без них вы просто упоминаете функцию, как упомянули бы переменную.
Скобки — кнопка «пуск». ping — это сам прибор, ping() — нажатие на кнопку.
Вызывать можно сколько угодно раз, и каждый вызов выполняет тело заново. Значения в скобках при вызове — аргументы; внутри функции они попадают в параметры, перечисленные при объявлении. Что будет, если аргументов передать больше или меньше, чем параметров, и как задать значение по умолчанию, разбирает следующая статья — «Параметры, аргументы и значения по умолчанию».
Если в теле нет return, вызов всё равно даёт значение — undefined. Это не ошибка, а честный ответ «результата не предусмотрено».
Функция — это действие, поэтому её имя обычно начинается с глагола: show, calc, check, create. Существительное в роли имени функции сбивает с толку: непонятно, вернёт оно значение, нарисует что-то на экране или сделает и то и другое.
| Имя | Чего ждём от вызова |
|---|---|
| showPrice() | покажет цену — вернуть, скорее всего, ничего не вернёт |
| calcTotal() | посчитает и вернёт сумму |
| checkAge() | проверит возраст и вернёт да или нет |
| price() | непонятно: показать? посчитать? взять готовое? |
Второе правило — одно имя, одно дело. Если честное имя получается вида calcAndSaveAndPrint, это сигнал: внутри живут три функции, которые пока склеены в одну.
Функции нужны не только ради экономии строк. Даже действие, которое встречается ровно один раз, стоит вынести — просто чтобы у него появилось имя, и большая задача читалась как список понятных шагов.
Здесь одна функция считает, другая оформляет. Поменяется цена — правим первую; захотим писать «₽» вместо «руб.» — вторую. Каждую можно проверить отдельно, и ошибка в одной не размазывается по всей программе.
Так и выглядит нормальный код: десяток маленьких функций с честными именами и несколько строк, которые вызывают их в нужном порядке.
- Функция — это действие с именем: описали один раз, вызываете сколько угодно.
- Объявление начинается с function: имя, круглые скобки с параметрами, тело в фигурных скобках.
- Объявление ничего не выполняет — код внутри запускают круглые скобки при вызове.
- Имя без скобок — сама функция, имя со скобками — её запуск.
- Имена функций начинаются с глагола и обещают ровно одно дело; из таких кусочков и собирают большую задачу.
1/3Что произойдёт, если функцию объявить, но ни разу не вызвать?
2/3Функция greet печатает приветствие. Что выведет console.log(greet) — без скобок?
3/3Функция считает итоговую сумму корзины. Какое имя лучше?
Приветствие по имени
Допишите тело функции greet так, чтобы вызовы ниже напечатали ожидаемые строки. Сами вызовы менять не нужно.
Параметр name — это обычная переменная внутри функции: при каждом вызове в неё попадает свой аргумент. Остаётся склеить строку и напечатать её.
Обратите внимание: console.log написан один раз, а строк в консоли две — их дали два вызова.
Свернуть повтор в функцию
Ниже две почти одинаковые строки. Придумайте функции честное имя-глагол, вынесите в неё общее, а различающееся передайте параметрами.
Различаются название и цена — значит, это два параметра. Всё остальное уезжает в тело.
Теперь формат строки описан в одном месте: захотите поменять «руб.» на «₽» — правка ровно одна.