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

Когда вы вызываете функцию таким способом, при котором привязка
                  переменной this не очевидна (как при вызове метода speak ранее),
                  становится довольно сложно предсказать  ее значение.  Все зависит
                  от того, находитесь ли вы в строгом режиме, и от места, из которого
                  функция вызывается. Мы преднамеренно не рассматриваем эти под­
                  робности, поскольку таких ситуаций лучше  избегать. Чтобы узнать
                  больше,  обратитесь  к  теме  Code f o rmatting  (форматирование кода)
                  в документации MDN.

          Т е рмин метод (method) традиционно ассоциируется с объектно-ориентирован­
       ным  программированием,  и  в  этой книге мы будем использовать его для обозна­
       чения функции, которая является свойством объекта и  предназначена для вызова
                                                               (
       непосредственно из экземпляра объекта (например,  .   speak  )   ). Если в функции не
                                                       о
       используется переменная this ,   то мы все равно будем называть ее функцией неза­
       вис�мо от того, где она объявлена.
          Одна из особенностей переменной this зачастую сбивает с толку, когда необхо­
       димо получить доступ к ней во вложенной функции.  Рассмотрим следующий при­
       мер, в котором мы используем в методе вспомогательную функцию.

       const  о  =  {
           name :  ' J ulie ' ,
           greetBackwards :  function ( )    {
               function  getReverseName ( )
                   let  nameBackwards  =  ' '  ;
                                                 =
                   for ( l e t   i=th s . name . l ength-1 ;   i> O ;   i--)  {
                              i
                                         i
                       nameBackwards  +=  th s . name ( i ] ;
                   return  nameBackwards ;
               return  ' $ { getReverseName ( ) }  si  eman  ym  , o l l e H  ' ;
           } ,
       } ;
       o  . greetBackwards ( ) ;
          Здесь мы используем вложенную функцию, getReverseName, для изменения име­
       ни на обратное. К сожалению, getReverseName  не будет работать так, как ожида­
                                        (
       лось: при вызове  .   greetBackwards  )   JavaScript привязывает переменную this, как
                       о
       и ожидалось к объекту о. Но когда происходит вызов getReverseName внутри функ­
       ции greetBackwards, переменная this связывается с чем-то друrим1• Обычно реше­
       ние этой проблемы подразумевает применение второй переменной, которой присва­
       ивается значение this.


       1 Она будет связана с глобальным объектом или unde f ined, в зависимости от того, находитесь ли
       вы в  строгом  режиме.  Мы  не рассматриваем здесь все подробности, поскольку такой ситуации
       следует избегать.

                                                             Ключевое слово this   1 3 7
   132   133   134   135   136   137   138   139   140   141   142