Выразительный JavaScript (Хавербеке) - страница 31

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