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

а использованы - в другом,  поэтому вам,  возможно, придется  приложить некото­
       рые усилия, чтобы разобраться в их областях видимости.
          В  "традиционной"  программе  все  ваши  функции  могли  бы быть  определены
       в глобальной области видимости, и если вы не будете обращаться к глобальной об­
       ласти видимости из своих функций (как я рекомендую), вы даже не должны будете
       заботиться о том, к какой области видимости у ваших функций есть доступ.
          В современных программах на JavaScript, однако, функции зачастую определяют­
       ся везде, где они необходимы. Их присваивают переменным или свойствам объектов,
       добавляют в массивы, передают в другие функции, возвращают из функций, а иногда
       не присваивают им имен вообще.
          Довольно часто функцию преднамеренно определяют в некоторой области види­
       мости, чтобы гарантированно получить доступ к переменным из этой области. В ре­
       зультате получается замкнутое выражение (closure) (вы можете считать его областью
       видимости, замкнутой вокруг функции). Давайте рассмотрим пример  замкнутого
       выражения.

       let  global F u c ;            / /  неопределенная  г л обальная  функция
                   n
           let  ЬlockVar  = ' а  ' ;    1 1   переменная  области  видимости  блока
           globalFunc  =  function ( )
               console . l og ( Ь lockVar ) ;


       globalFunc ( ) ;               / /  выводит  "а "
                        b
          В функции glo a l F unc  присваивается значение переменной в  пределах блока:
       этот блок (и его родительская, глобальная область видимости) формирует замкнутое
       выражение. Независимо от того, где вы вызываете функцию globalFunc, у нее будет
       доступ к идентификаторам в этом замкнутом выражении.
          Давайте рассмотрим происходящее: при вызове у функции globalFunc есть до­
       ступ к переменной ЫockVar, несмотря на то что мы вь1шли из этой области ви­
       димости. Обычно после выхода из области видимости объявленные в этой области
       видимости  переменные могут безопасно прекратить существование. Здесь движок
       JavaScript замечает, что функция определена в этой области видимости (обратиться
       к функции можно и за пределами области видимости), поэтому переменная должна
       быть всегда доступна.
          Таким образом, определение функции в пределах замкнутого выражения может
       повлиять на продолжительность существования замкнутого выражения; это также
       позволяет нам получить доступ к сущностям, к которым у нас обычно не было до­
       ступа. Рассмотрим пример.
       let  f ;                    / /   неопределенная  функция

                      t
           let  о  =  {  no e :    ' Б езопасно '  } ;
       1 5 2    Глава 7. Область видимости
   146   147   148   149   150   151   152   153   154   155   156