Однако, не надо стесняться писать не совсем чистые функции, или начинать священную чистку кода от таких функций. Побочные эффекты часто полезны. Нет способа написать чистую версию функции >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.