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

Так что же здесь происходит? На первый взгляд, не имеет никакого смысла обра­
       щаться к переменной до ее объявления. Однако к переменным, объявленным с клю­
       чевым словом var, применяется механизм подъема (hoisting). JavaScript просматри­
       вает всю область видимости (функции или глобальную) и поднимает к ее вершине
       все переменные, объявленные с ключевым словом var. Важно понимать, что подни­
       маются только объявления, а не присвоения. Таким образом, JavaScript интерпрети­
       ровал бы предыдущий пример так.
       var  х ;    / /  поднято  объявление  (но  н е   присвоение)
       х ;        / /  undefined
       х  =  3 ;
       х ;        11  3
          Давайте  рассмотрим  более  сложный  пример  наряду  со  способом,  которым
       JavaScript его интерпретирует.
       / /   что  вы пишете           / /  как  JavaScript  интерпретирует  это
                                       var  х ;
                                       var  у ;
       i f ( x   ! ==  3 )    {        i f (x  ! = =  3 )    {
           console . l og ( y ) ;          console . l og ( y ) ;
           var  у  =  5 ;                  у  =  5 ;
           i f ( y   ===  5 )    {         i f ( y    ===  5 )
               var  х  =  3 ;                 х  =  3 ;

           console . l og ( y ) ;          console . log ( у )  ;

       i f   ( х   ===  3 )    {       i f   ( х   ===  3 )    {
           console . l og ( y ) ;          console . l og ( y ) ;


          Я не утверждаю, что это хорошо написанный код на JavaScript. Не нужно исполь­
       зовать переменные прежде, чем вы их объявите. Это ведет к ошибкам и  не имеет
       никакого практического смысла. Но в данном примере действительно поясняется,
       как работает механизм подъема.
          Еще один аспект переменных, объявленных с ключевым словом var, - движок
       JavaScript не обращает внимание на их повторное объявление.
       / /  что  вы  пишете           / /  как  JavaScript  интерпретирует  это
                                       var  х ;
       var  х  =  3 ;                  х  =  3 ;
       i f   ( х   ===  3 )            i f   ( х   ===  3 )    {
           var  х  =  2 ;                  х  =  2 ;
           console . l og ( x ) ;          console . l og ( x ) ;

       console . l og ( x ) ;          console . l og ( x ) ;
          Этот пример должен прояснить, что (в пределах той же функции или глобальной
       области видимости) ключевое слово var не может использоваться для создания новых


                               Область видимости функции и механизм подъема объявлений   155
   149   150   151   152   153   154   155   156   157   158   159