Вызов функции — выражение

Посмотрите на код из одного из предыдущих уроков:

const distance = calculateDistance('Lannisport', 'Bayasabhad');
console.log(distance); // 1280

Что можно сказать о нём? Какие выводы сделать? Попробуйте закончить эти утверждения самостоятельно:

  • distance — это __________
  • функция calculateDistance вызывается с ___________ 'Lannisport' и 'Bayasabhad'
  • функция calculateDistance возвращает значение, тип которого — это _____.
  • после выполнения кода в константе distance окажется ________, возвращенное вызовом функции calculateDistance

Чтобы понять этот урок, нужно вспомнить понятие «выражение» из модуля про переменные. Напомним, что выражение — это код, который при выполнении программы вычисляется в значение.

Какие из этих фрагментов кода являются выражениями?

  1. 42
  2. 10 * 45
  3. 'Kings ' + 'road'
  4. calculateDistance('Lannisport', 'Bayasabhad')

Числа и математические операции — наверное, самые простые варианты. Выражение 42 вычислится в значение 42, выражение 10 * 45 — в значение 450.

Конкатенация строк — тоже выражение, которое вычислится в соответствующее значение (новую строку).

Но вот четвёртый вариант… Это тоже выражение! Мощность и гибкость языка программирования во многом возможна благодаря тому, что вызов функции — это выражение.

Вернемся к первому примеру:

const distance = calculateDistance('Lannisport', 'Bayasabhad');

В переменную distance записывается результат вычисления выражения. В отличие от операций (например, 10 + 12), где явно видно, какое вычисление производится, в функциях само вычисление скрыто от нас, и мы видим только результат. Поэтому говорят, что функция «возвращает» значение. Можно применить эту терминологию и к обычным операциям. Например, сказать, что конкатенация двух строк возвращает новую строку.

Что является выражением, а что нет? Сейчас может казаться, что это одна из скучных деталей из учебника по программированию. Но это действительно важный вопрос. Всё, что работает как выражение, может быть использовано в других выражениях, а также во всех местах, где на вход ожидаются выражения. Распознавать выражения в коде — важный навык, необходимый программисту каждый день.

Допустим, у нас есть функция numberOfKnights, которая принимает название замка в королевстве и возвращает количество рыцарей в этом замке. Зная, что вызов функции — выражение, можно допустить, что такой код будет работать:

const result = 4 + numberOfKnights('Winterfell');

Почему? Сложение это выражение, а значит его операндами могут быть другие выражения: выражения 4 и выражения numberOfKnights('Winterfell'). В итоге получится 4 + какое-то число.

Значит, и такой код будет работать:

const result = numberOfKnights('Winterfell') + numberOfKnights('Oldtown');

Здесь два разных вызова функций, но каждый вызов — выражение, поэтому в итоге получится сложение двух значений — двух чисел (количества рыцарей замка Winterfell и количества рыцарей замка Oldtown).

Задание

Арья собирается в путешествие из Винтерфела в Орлиное гнездо, чтобы навестить Лизу Аррен, но по пути ей нужно заехать к Фреям для совершения акта возмездия. Ей нужно рассчитать общую длину маршрута.

К сожалению, функция calculateDistance может вычислять расстояние только между двумя точками. Поэтому придется сначала узнать расстояние от Винтерфелла до замка Фреев, а потом расстояние до Орлиного гнезда.

Названия замков на английском языке:

  • Винтерфелл — Winterfell
  • Близнецы (Замок Фреев) — The Twins
  • Орлиное гнездо — The Eyrie

Выведите на экран полную длину маршрута Арьи. Напомним, что функция calculateDistance принимает два аргумента и возвращает число.


Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics

Упражнение доступно только авторизованным пользователям.

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