Функции
Задачи, требующие использования функций
В предыдущих главах мы познакомились с числами, строками и основными действиями над ними. Кроме этого мы научились прятать необходимые значения в переменные, чтобы они хранились там пока не понадобятся.
Теперь предположим, что нам понадобилось сохранить в переменной не фиксированное значение, а какой-то набор действий. Javascript делает это возможным!
Рассмотрим задачу: каждую весну дедушка Мазай выезжает на своей лодке спасать зайцев от наводнения. Нужно посчитать, сколько зайцев будет сидеть в последней лодке, если одновременно с дедушкой лодка вмещает до 6
зайцев. Также известно следующее:
- Как минимум один раз Мазай выезжает на поиски обязательно
- Если в лодке есть свободные места и на реке остались неспасённые зайцы, дедушка домой не вернётся
- Спасение продолжается до последнего зайца (то есть, если Мазай привёз полную лодку зайцев и отпустил, но на реке ещё остались зайцы, он за ними снова поедет)
Количество зайцев становится известным только в момент выполнения программы. Нужно писать функцию:
var lastBoatRabbits = function(totalRabbits) {
return totalRabbits % 6;
};
// Найдём количество зайцев в последней лодке
// в зависимости от общего количества зайцев:
lastBoatRabbits(7); // => 1, правильно
lastBoatRabbits(0); // => 0, тоже правильно
lastBoatRabbits(6); // => 0, не правильно
Функция возвращает 0
для случаев, когда зайцев не было вообще,
и для случаев, когда количество зайцев было кратно 6
.
Как исправить функцию, мы разберёмся в следующей главе,
зато общий принцип создания функции более-менее ясен:
var lastBoatRabbits = // По этому имени мы будем ссылаться на функцию
function( // Ключевое слово, по которому javascript узнаёт функцию
totalRabbits // Список аргументов. В данном случае аргумент — один
) { // Открывающая фигурная скобка
// ... // Здесь могут быть вычисления
return totalRabbits % 6; // Возвращаем результат вычисления
}; // Закрывающая фигурная скобка
Функция может быть объявлена и по-другому:
function lastBoatRabbits(totalRabbits) {
return totalRabbits % 6;
}
В этом случае функция будет доступна раньше, чем объявлена.
Функция, принимающая несколько параметров
Теперь давайте напишем функцию, подсчитывающую периметр прямоугольника. Аргументами функции будут высота и ширина прямоугольника.
var rectangleArea = function(height, width) {
return 2 * (width + height);
};
Как видим, аргументы функции разделяются между собой запятой.
Область видимости переменных
Переменная, определенная внутри функции, доступна только внутри этой функции, либо внутри функции, определённой внутри этой функции. Звучит не очень понятно, давайте попробуем разобраться на примере:
var outerFunction = function() {
var variable = 32;
var innerFunction = function() {
console.log(variable); // [1]
variable = 36;
console.log(variable); // [2]
};
innerFunction();
console.log(variable); // [3]
};
outerFunction();
console.log(variable); // [4]
Если мы выполним этот код, мы получим:
32
36
36
Uncaught ReferenceError: variable is not defined
Переменная variable
определена внутри функции outerFunction
и доступна внутри этой функции [3]. Также она доступна внутри
функции innerFunction
, которая определена внутри функции outerFunction
[1, 2].
При этом снаружи функции outerFunction
переменная недоступна,
и попытка отображения значения этой переменной приводит к ошибке [4].
Задания
- Напишите функцию
seconds
, принимающую числовой параметрtotal
и возвращающую остаток от деления числаtotal
на60
. - Напишите функцию
perimeter
, подсчитывающую периметр правильного многоугольника. Первый параметр функции —side
, длина стороны, второй параметр —count
, количество сторон в многоугольнике. - Напишите функцию
pedestrianFlowRate
, которая определяет, сколько времени светофор, управляющий движением пешеходов, позволяет пешеходам проходить через дорогу. Первый параметрcycleLength
— количество времени, в течение которого сигналы светофора полностью повторяются (можно засечь от одного загорания зелёного сигнала, до следующего). Второй параметрtrafficLength
— время, в течение которого движение пешеходов блокировано автотранспортом, едущим перпендикулярно пешеходному переходу. Третий параметрturningLength
— время, в течение которого возможен проезд по пешеходному переходу транспорта, поворачивающего с параллельных направлений. Функция должна возвращать значение в процентах.