Функции: объявление и вызов

функции≈ 7 минут

Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.

Функция — это кусок кода, которому дали имя. Один раз описали действие через function — и дальше вызываете его по имени столько раз, сколько нужно, вместо того чтобы переписывать одно и то же.

Разделы темы:·

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

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Функция решает обе беды сразу. Она собирает действие в одном месте и даёт ему имя, а имя — это уже язык, на котором удобно думать: не «склей три строки», а «поздоровайся».

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Захотели поменять формулировку — правите одну строку внутри функции, и меняется везде. Это и есть главная выгода: у поведения появился один хозяин.

Самый привычный способ создать функцию — объявление. Оно состоит из четырёх частей подряд: ключевое слово function, имя, круглые скобки (в них перечисляют параметры, но их может и не быть) и тело в фигурных скобках.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Обратите внимание: сам факт объявления ничего не печатает. Тело — это записанный рецепт, а не приготовленное блюдо. Движок запоминает его под именем sayHello и ждёт, когда его позовут.

Объявления функций движок находит и «поднимает» ещё до выполнения кода — этот механизм называют всплытием (hoisting). Поэтому такой порядок работает, хотя выглядит странно.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Работает — но читателю кода от этого не легче. Привычка объявлять раньше, чем вызывать, экономит нервы вам же через месяц. Сам механизм и его разницу с переменными разбирает статья «Всплытие и временная мёртвая зона».

Вызов — это имя функции плюс круглые скобки. Именно скобки запускают тело; без них вы просто упоминаете функцию, как упомянули бы переменную.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Скобки — кнопка «пуск». ping — это сам прибор, ping() — нажатие на кнопку.

Вызывать можно сколько угодно раз, и каждый вызов выполняет тело заново. Значения в скобках при вызове — аргументы; внутри функции они попадают в параметры, перечисленные при объявлении. Что будет, если аргументов передать больше или меньше, чем параметров, и как задать значение по умолчанию, разбирает следующая статья — «Параметры, аргументы и значения по умолчанию».

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Если в теле нет return, вызов всё равно даёт значение — undefined. Это не ошибка, а честный ответ «результата не предусмотрено».

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Функция — это действие, поэтому её имя обычно начинается с глагола: show, calc, check, create. Существительное в роли имени функции сбивает с толку: непонятно, вернёт оно значение, нарисует что-то на экране или сделает и то и другое.

ИмяЧего ждём от вызова
showPrice()покажет цену — вернуть, скорее всего, ничего не вернёт
calcTotal()посчитает и вернёт сумму
checkAge()проверит возраст и вернёт да или нет
price()непонятно: показать? посчитать? взять готовое?

Второе правило — одно имя, одно дело. Если честное имя получается вида calcAndSaveAndPrint, это сигнал: внутри живут три функции, которые пока склеены в одну.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Функции нужны не только ради экономии строк. Даже действие, которое встречается ровно один раз, стоит вынести — просто чтобы у него появилось имя, и большая задача читалась как список понятных шагов.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Здесь одна функция считает, другая оформляет. Поменяется цена — правим первую; захотим писать «₽» вместо «руб.» — вторую. Каждую можно проверить отдельно, и ошибка в одной не размазывается по всей программе.

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

  • Функция — это действие с именем: описали один раз, вызываете сколько угодно.
  • Объявление начинается с function: имя, круглые скобки с параметрами, тело в фигурных скобках.
  • Объявление ничего не выполняет — код внутри запускают круглые скобки при вызове.
  • Имя без скобок — сама функция, имя со скобками — её запуск.
  • Имена функций начинаются с глагола и обещают ровно одно дело; из таких кусочков и собирают большую задачу.

1/3Что произойдёт, если функцию объявить, но ни разу не вызвать?

2/3Функция greet печатает приветствие. Что выведет console.log(greet) — без скобок?

3/3Функция считает итоговую сумму корзины. Какое имя лучше?

Приветствие по имени

Допишите тело функции greet так, чтобы вызовы ниже напечатали ожидаемые строки. Сами вызовы менять не нужно.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Параметр name — это обычная переменная внутри функции: при каждом вызове в неё попадает свой аргумент. Остаётся склеить строку и напечатать её.

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Обратите внимание: console.log написан один раз, а строк в консоли две — их дали два вызова.

Свернуть повтор в функцию

Ниже две почти одинаковые строки. Придумайте функции честное имя-глагол, вынесите в неё общее, а различающееся передайте параметрами.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Различаются название и цена — значит, это два параметра. Всё остальное уезжает в тело.

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Теперь формат строки описан в одном месте: захотите поменять «руб.» на «₽» — правка ровно одна.