Однако, не надо стесняться писать не совсем чистые функции, или начинать священную чистку кода от таких функций. Побочные эффекты часто полезны. Нет способа написать чистую версию функции console.log
, и эта функция весьма полезна. Некоторые операции легче выразить, используя побочные эффекты.
Итог
Эта глава показала вам, как писать собственные функции. Когда ключевое слово function
используется в виде выражения, возвращает указатель на вызов функции. Когда оно используется как инструкция, вы можете объявлять переменную, назначая ей вызов функции.
// Создаём f со ссылкой на функцию
var f = function(a) {
console.log(a + 2);
};
// Объявляем функцию g
function g(a, b) {
return a * b * 3.5;
}
Ключевой момент в понимании функций – локальные области видимости. Параметры и переменные, объявленные внутри функции, локальны для неё, пересоздаются каждый раз при её вызове, и не видны снаружи. Функции, объявленные внутри другой функции, имеют доступ к её области видимости.
Очень полезно разделять разные задачи, выполняемые программой, на функции. Вам не придётся повторяться, функции делают код более читаемым, разделяя его на смысловые части, так же, как главы и секции книги помогают в организации обычного текста.
Упражнения
Минимум
В предыдущей главе была упомянута функция Math.min
, возвращающая самый маленький из аргументов. Теперь мы можем написать такую функцию сами. Напишите функцию min, принимающую два аргумента, и возвращающую минимальный из них.
console.log(min(0, 10));
// → 0
console.log(min(0, -10));
// → -10
Рекурсия
Мы видели, что оператор %
(остаток от деления) может использоваться для определения того, чётное ли число (% 2
). А вот ещё один способ определения:
• Ноль чётный.
• Единица нечётная.
• У любого числа N чётность такая же, как у N - 2.
Напишите рекурсивную функцию isEven
согласно этим правилам. Она должна принимать число и возвращать булевское значение.
Потестируйте её на 50 и 75. Попробуйте задать ей -1. Почему она ведёт себя таким образом? Можно ли её как-то исправить?
console.log(isEven(50));
// → true
console.log(isEven(75));
// → false
console.log(isEven(-1));
// → ??
Считаем бобы
Символ номер N строки можно получить, добавив к ней .charAt(N)
("строчка".charAt(5)
) – схожим образом с получением длины строки при помощи .length
. Возвращаемое значение будет строковым, состоящим из одного символа (к примеру, "к"
). У первого символа строки позиция 0, что означает, что у последнего символа позиция будет string.length - 1
. Другими словами, у строки из двух символов длина 2, а позиции её символов будут 0 и 1.
Напишите функцию countBs
, которая принимает строку в качестве аргумента, и возвращает количество символов “B”, содержащихся в строке.
Затем напишите функцию countChar
, которая работает примерно как countBs
, только принимает второй параметр — символ, который мы будем искать в строке (вместо того, чтобы просто считать количество символов “B”). Для этого переделайте функцию countBs
.
4. Структуры данных: объекты и массивы
Два раза меня спрашивали: «Скажите, м-р Бэббидж, а если вы введёте в машину неправильные данные, получится ли правильный ответ?». Непостижима та путаница в головах, которая приводит к таким вопросам.