Page 215 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 215
чистой, поскольку возвращает то одно значение, то другое в зависимости от того,
когда вы ее вызовете (в один год она может возвратить t r ue, а на следующий -
false). Во-вторых, у функции не должно быть побочных эффектов (side effect). Та
ким образом, вызов функции не должен изменять состояние программы. В нашем
обсуждении мы еще не встречали функций с побочными эффектами (мы не считаем
вывод на консоль побочным эффектом). Давайте рассмотрим простой пример.
й
const colors = [ ' к расный ' , ' о ранжевы й ' , ' ж елты ' , ' з елены й ' ,
' г олубой ' , ' с иний ' , ' ф иолетовый ' ] ;
let colorindex = -1 ;
function getNextR i nbowColor ( ) {
a
i f ( ++colorindex >= colors . length) colorindex О ;
x
return colors [ c olorinde ] ;
Функция getNextRainbowCo o r возвращает каждый раз другой цвет, цикличе
l
ски проходя все цвета радуги. Эта функция нарушает оба правила чистой функции:
у нее разные возвращаемые значение для одного и того же входного значения (у
нее нет аргументов, поэтому ее входного значение - ничего), и ее вызов приводит
к побочному эффекту (изменение значения переменной colorindex). Переменная
colorindex не является частью функции; вызов getNextRainbowColor модифициру
ет ее, что является побочным эффектом.
Вернемся на мгновение к нашей задаче определения високосного года. Как мы
можем преобразовать свою функцию високосного года в чистую функцию? Просто!
function isLeapYear ( y ear ) {
i f ( y ear % 4 ! = = 0 ) return false;
else if ( y ear % 1 0 0 != 0 ) return true ;
else i f ( y ear % 4 0 0 ! = 0 ) return false ;
else return true ;
Эта новая функция всегда будет возвращать одно и то же значение для одного и того
же входного значения, и она не вызывает побочных эффектов, что делает ее чистой.
Наша функция getNextRainbowColor немного сложнее. Мы можем устранить по
бочный эффект, поместив внешние переменные в замкнутое выражение.
const getNextRainbowColor = ( f unction ( ) {
й
const colors = [ ' красный ' , ' о ранжевый ' , ' ж елтый ' , ' з елены ' ,
' г олубой ' , ' с ини ' , ' ф иолетовы ' ] ;
й
й
let colorindex = - 1 ;
return function ( ) {
if ( ++colorindex >= colors . length) colorindex О ;
return colors [ c olorindex] ;
} ;
} ) ( ) ;
218 Глава 13. Функции и мощь абстрактного мышления

