Функции и их вызов

Сложение, конкатенация, нахождение остатка от деления и остальные рассмотренные операции – все это довольно базовые возможности языков программирования. Математика не ограничена арифметикой, кроме нее есть и множество других разделов со своими операциями, например, геометрия. То же самое касается и строк: их можно переворачивать, менять регистр букв, удалять лишние символы — и это только самое простое. И, наконец, на более высоком уровне есть прикладная логика конкретного приложения. Программы списывают деньги, считают налоги, формируют отчеты. Количество подобных операций бесконечно и индивидуально для каждой программы. И все они должны быть как-то выражены в коде.

Для выражения любой произвольной операции в программировании существует понятие функция. Функции бывают как встроенные, так и добавленные программистом. С одной встроенной функцией мы уже знакомы, это log() в вызове console.log().

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

Начнем с простых функций для работы над строками. Ниже пример вызова функции reverse(), которая переворачивает строку:

// reverse это функция
import { reverse } from 'hexlet-basics/string';

// Вызов функции reverse с аргументом 'Hello!'
const result = reverse('Hello!');
console.log(result); // => '!olleH'

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

Мы создали константу result и указали интерпретатору записать в неё результат, который вернет вызов функции reverse(). В этом смысле функции идентичны операциям - они всегда возвращают результат своей работы. Запись reverse('Hello!') означает, что вызывается функция с именем reverse, в которую был передан аргумент (или параметр) 'Hello!'. Аргументы нужны функциям для работы так же, как операторам нужны операнды. Функция reverse() переворачивает именно ту строку, которая передается ей в аргументах.

Вызов функции всегда обозначается скобками (), идущими сразу за именем функции. В скобках может быть любое количество аргументов, а иногда — вообще ни одного. Количество зависит от используемой функции, например, функция pow() принимает на вход два аргумента и возводит число, переданное первым параметром, в степень, переданную вторым параметром.

import { pow } from 'hexlet-basics/math';

const result = pow(2, 3); // 2 * 2 * 2
console.log(result); // => 8

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

3 + 5; // 8
sum(3, 5); // 8
// или даже так
// В js такой синтаксис невозможен, но есть языки (lisp)
// где оно выглядит очень похоже (посмотрите курс по Racket)
+(3, 5);

Вопрос на самопроверку. Как узнать, что возвращает вызов console.log? Проверьте.

Задание

В 7 королевствах жил один человек — Сэм Тарли, который занимался картографией. Он имел доступ к компьютерам и умел программировать, поэтому написал для себя функцию calculateDistance(). Функция высчитывает расстояние между городами в лигах. Она принимает два строковых параметра (названия городов) и возвращает число (расстояние между ними).

Вот пример использования, где на экран выводится расстояние между городами Lannisport и Bayasabhad:

import { calculateDistance } from 'hexlet-basics/got';

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

Первая строчка — это специальный код, подключающий функцию calculateDistance() в вашу программу. Благодаря ей вы можете запускать функцию, не видя её содержимое. Это обычное дело в программировании: вы знаете, что делает функция и как ей пользоваться, но не знаете, как именно она работает внутри.

Воспользуйтесь функцией calculateDistance() и выведите на экран расстояние между городами Qarth и Vaes Dothrak. Не копируйте пример, а создайте константу с другим именем и напишите код с нуля самостоятельно.


Определения

  • Функция — операция, способная принимать данные и возвращать результат; функция вызывается так: foo().

  • Аргумент — информация, которую функция получает при вызове. Например, foo(42) — передача аргумента 42 функции foo()


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

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