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. Функции и мощь абстрактного мышления
   210   211   212   213   214   215   216   217   218   219   220