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

const  f  =  function ( )
           1 1   .  .  .
       } ;
          Результат  такой,  как будто  мы объявили  функцию обычным способом: здесь
       имеется идентификатор  f, который позволяет обращаться к функции.  Как и  при
       обычном объявлении функции,  мы можем вызвать ее,  используя  синтаксис  f ( ) .
       Единственное отличие в том, что здесь мы создаем анонимную функцию (используя
       функциональное выражение) и присваиваем ее переменной.
          Анонимные функции используются все время: как аргументы других функций
       или  методов  либо  при  создании  функциональных свойств в  объекте.  Мы  будем
       встречаться с ними повсюду в книге.
          Я сказал, что имя функции является необязательным в функциональном выраже­
           .
           .
       нии  .   Так что же происходит, когда мы присваиваем функции имя и присваиваем ее
                                                       )
       переменной (и для чего это может нам понадобиться ?   Рассмотрим пример.
       const  g  =  function  f  ( )    {
           1 1   .  .  .

          Когда функция создается таким способом, имя g имеет приоритет, и для обра­
       щения к функции (извне функции) мы используем имя g; попытка доступа к f при­
       водит к ошибке неопределенности переменной. С учетом вышесказанного зачем бы
       нам это могло понадобиться? Это может быть необходимо, если нужно обратиться
       к функции из самой функции (так называемая рекурсия (recursion)).
       const  g  =  function  f  ( stop)  {
           i f ( s top)  console . l o ( ' f    остановлена ' ) ;
                             g
           f  t ru ) ;
            (
                e
       } ;
       g  ( f als ) ;
             e
          В самой функции мы используем  f,  чтобы сослаться на функцию, а вне  мы ис­
       пользуем g. Нет никакого особенно серьезного основания, чтобы присваивать функ­
       ции два разных имени, но здесь мы делаем так для пояснения работы именованных
       функциональных выражений.
          Поскольку объявление функции и функционального выражения выглядят идентич­
       но, вы могли бы задаться вопросом «Как JavaScript их различает (или есть ли там ка­
       кое-нибудь различие)?» Оrвет - контекст: если объявление функции используется как
       выражение, то это функциональное выражение, а если нет, то это объявление функции.
          Различие является главным образом академическим, и вы не должны обычно ду­
       мать о нем. Определяя именованную функцию, которую вы намереваетесь вызвать
       позже, вы, вероятно, будете использовать объявление функции, не думая об этом,
       а если необходимо создать функцию для присваивания чему-то или для передачи
       в другую функцию, вы будете использовать функциональное выражение.


                                      Функциональные вы р ажения и анонимные функции   1 3 9
   134   135   136   137   138   139   140   141   142   143   144