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

Область видимости и существован и е   переменных

          Интуитивно понятно, что если переменной не существует, ее нет и в области ви­
       димости. Таким образом, переменные, которые еще не были объявлены, или пере­
       менные, которые прекратили существование после выхода из функции, очевидно не
       находятся в области видимости.
          А наоборот? Если переменная не находится в области видимости, то означает ли это,
       что ее не существует? Вовсе не обязательно, и именно здесь необходимо сделать разли­
       чие между областью видимости (scope) и существованием (existence) переменной.
          Область видимости (или видимость (visiЬility)) относится к идентификаторам, ко­
       торые в настоящее время видимы и доступны выполняющейся в данный момент час­
       ти программы (называемой контекстом выполнения (execution context)). Существо­
       вание, напротив, относится к идентификаторам, которые содержат нечто, для чего
       была распределена (т.е. зарезервирована) область памяти. Скоро мы увидим примеры
       переменных, которые существуют, но не находятся в области видимости.
          Когда нечто прекращает существовать, JavaScript не обязательно освобождает па­
       мять сразу же: она просто помечается как не используемая и освобождается только
       при периодически запускаемом процессе сборки мусора  (garbage collection). Сборка
       мусора в JavaScript осуществляется автоматически и будет вас интересовать только
       в определенных чрезвычайно требовательных приложениях.


                         и
       Л е к сическая  л и   д и н а м и ческая область видимости
          Глядя на исходный код программы, вы видите ее лексическую структуру (lexical
       structure). Когда программа выполняется фактически, поток выполнения может быть
       не последовательным. Рассмотрим программу с двумя функциями.
           t
                  (
       func i on  fl  )    {
           console . l og ( ' on ' ) ;
                         e
                  (
       function  f2  )   {
                         o
           console . log ( ' t w ' ) ;

       f2  ) ;
         (
       f 1   ( ) ;
         (
       f2  ) ;
          Лексически эта программа - просто набор операторов, которые мы обычно чи­
       таем сверху вниз. Но когда мы запускаем эту программу, поток выполнения пере­
       ходит сначала к телу функции f2, затем - к телу функции fl (даже при том, что она
       определена до f2) и наконец - снова к телу функции f2.




       1 4 6    Глава 7. Область видимости
   140   141   142   143   144   145   146   147   148   149   150