Создание (определение) функции

Определение собственных функций значительно упрощает написание и поддержку программ. Функции позволяют объединять сложные (составные) операции в одну. Например, отправка письма на сайте - это достаточно сложный процесс, включающий в себя взаимодействие с внешними системами (интернет). Благодаря возможности определять функции, вся сложность может быть скрыта за простой функцией:

import { send } from 'some-email-package';

const email = '[email protected]';
const title = 'Помогите';
const body = 'Я написал историю успеха, как я могу получить скидку?';

// Один маленький вызов — и много логики внутри
send(email, title, body);

Создадим нашу первую функцию. Её задача вывести на экран следующий текст:

Today is: December 5
// Определение функции
// Определение не вызывает функцию
// Мы лишь говорим, что теперь такая функция существует
const showCurrentDay = () => {
  const text = 'Today is: December 5';
  console.log(text);
};

// Вызов функции
showCurrentDay();

Для любознательных. Такая функция в JavaScript называется стрелочной. Она появилась со стандартом языка ES6. Далее мы будем работать только со стрелочными функциями.

Определение функции выше состоит из двух частей:

  • Присваивание функции константе
  • Непосредственно определение функции

Само по себе определение функции - это всё, что находится после присвоения:

// Обратите внимание на стиль
// Пробелы между символами
// Открывающая скобка там же где и стрелка
// Закрывающая на своей отдельной строчке
() => {
  const text = 'Today is: December 5';
  console.log(text);
};

Такое определение создает функцию, но не вызывает её. Поскольку это определение не связывается ни с каким именем (константой), то такой код — бесполезен, хотя и является синтаксически корректным.

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

const doSomething = /* определение любой функции */;

В отличие от обычных данных, функции выполняют действия, поэтому их имена практически всегда должны быть глаголами: «построить что-то», «нарисовать что-то», «открыть что-то».

Всё, что описывается внутри фигурных скобок {}, называется телом функции. Внутри тела можно описывать любой код. Считайте, что это маленькая самостоятельная программа, набор произвольных инструкций. Тело выполняется ровно в тот момент, когда запускается функция. Причём каждый вызов функции запускает тело независимо от других вызовов. Кстати, тело может быть пустым:

// Минимальное определение функции, которая ничего не делает
const noop = () => {};

noop(); // вызов есть, а смысла нет
// Такая функция тоже бывает полезна
// Но это относится к продвинутым темам

Понятие «создать функцию» имеет много синонимов: «реализовать», «определить» и даже «заимплементить» (от слова implement). Все они встречаются в повседневной практике на работе.

Задание

Реализуйте функцию printMotto(), которая печатает на экран фразу Winter is coming.

printMotto(); // => Winter is coming

Важное замечание! В задачах, в которых нужно реализовать функцию, эту функцию вызывать не нужно. Вызывать функцию будут автоматизированные тесты, которые проверяют ее работоспособность. Пример с вызовом выше показан только для того, чтобы вы понимали, как ваша функция будет использоваться.


Советы


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном cообществе
Упражнение доступно только авторизованным пользователям.

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