Page 225 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 225

которая в основном ничего не делает. Таким образом, если  вы передаете ей  5,  она
       возвращает 5, и т.д. Есть более эффективные способы справиться с этой ситуаци­
       ей (такой, как вызов другой функции без дополнительных затрат на вызов пустой
       функции для каждого элемента), но это хорошая практика, чтобы научиться созда­
       вать "безопасные" функции таким способом.

       В озвращ    е н и е    функции из функции
          Возвращение функции из функции является, вероятно, не только самым загадоч­
       ным способом использования функций, но и  чрезвычайно полезным. Это можно
       сравнить с трехмерным принтером: это вещь, которая делает нечто (как функция),
       что может, в свою очередь, делать нечто, что также делает что-то. Но самая захваты­
       вающая часть здесь в том, что функция, которую вы возвращаете, может быть видо­
       изменена - очень похоже на то, как вы можете изменить то, что печатаете на трех­
       мерном принтере.
          Давайте предположим, что нашей функции sum, как и ранее, может передаваться
       (а может и нет!) функция для обработки каждого элемента массива, до того, как они
       будут просуммированы. Помните, как мы упоминали, что могли бы создать отдельную
       функцию sumOfSquares, если бы захотели? Давайте рассмотрим ситуацию в которой
       такая функция необходима, т.е. когда передавать в функцию и массив и другую функ­
       цию нежелательно. Нам явно нужна функция, которой передается только один массив
       значений, а она возвращает сумму его квадратов. (Если вы задаетесь вопросом, когда
       такое обстоятельство могло бы возникнуть, рассмотрите проект некого API, в котором
       вам разрешено создавать функции типа sum, только с одним аргументом.)
          Один из подходов подразумевает создание новой функции, которая просто вы­
       зывает нашу старую функцию.
       function  sumOfSquares  a rr)  {
                            (
           return  sum ( a rr,  х  =>  х * х ) ;

          Данный подход, конечно, прекрасен и вполне может сработать, если все, что не­
       обходимо, - это одна функция, но что если необходимо повторять этот шаблон раз
       за разом? Решением нашей проблемы могло бы быть создание функции, которая воз­
       вращает специализированную функцию.
       function  newSummer ( f )   {
           return  arr  =>  sum ( a rr,  f ) ;


          Эта новая функция, newSummer, создает совершенно новый вариант функции sum,
       которая имеет только один аргумент, но в  ней  используется специальная функция.
       Давайте рассмотрим, как мы могли бы использовать это для получения различных
       видов сумм.


       228     Глава 1 3 .  Функции и мощь абстрактного мышления
   220   221   222   223   224   225   226   227   228   229   230