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

update . c a l l ( b ruce,  1 9 4 9 ,    ' s inge ' )  ;
                                     r
           / /   bruce  теперь  {  пате :  "Bruce ",  ЬirthYear:  1 9 49,
           //    occupa tioп :  "siпge "  }
                                  r
       update . c a l l (madeline,  1 9 4 2 ,    ' a ctress ' ) ;
                                           п
           //  тadeliпe  теперь  {  пате :  "Madeli e " ,   ЬirthYea :   1 9 42,
                                                       r
           //    occupa tioп :  "actress "  }
          Метод apply идентичен методу call, за исключением способа, которым он обраба­
       тывает аргументы функции. Методу call аргументы передаются непосредственно, точно
       так же, как и обычной функции. Метод apply аргументы передаются в виде массива.

       update . apply ( b ruce ,  ( 1 955 ,   " a ctor" ] ) ;
           //  bruce  теперь  {  пате:  "Bruce ",  ЬirthYear:  1 9 55,
           / /   оссира tioп :  "a ctor"  J
                       e
                                          r
                 l
       update . app y (mad l i ne ,  ( 1 9 1 8 ,   "write " ] )  ;
                                           п
                                      a
           / /   тadeliпe  теперь  {  пате :  "M d eli e " ,   Ьirth Yea :   1918,
                                                       r
           11    occupa tioп :  "wri ter "  }
          Метод apply полезен, если у вас есть массив и вы хотите использовать его зна­
       чения как аргументы функции. Классический пример - поиск минимального или
       максимального числа в массиве. Вспомогательным функциям Ма th . rnin и Ма th . шах
       можно передать любое количество аргументов, а они возвращают минимальное или
       максимальное значение, соответственно. Мы можем использовать метод apply, что­
       бы вызвать эти функции с существующим массивом.
       const  arr  =  ( 2 ,   3 ,   - 5 ,   1 5 ,   7 ] ;
                             r
                   l
       Math . m in . a pp y ( n ull ,   ar ) ;   11  -5
                   l
       Math . m ax . a pp y ( n ull ,   arr) ;   11  1 5
                                                    м
          Обратите внимание, что вместо значения this  ы   просто передаем null. Так про­
       исходит потому, что в функциях Math . rn in и Math . rn ax не используется переменная
       this вообще; поэтому не имеет никакого значения, что мы передаем в качестве зна­
       чения для this.
          Оператор расширения (  . .   ) ЕSб позволяет достичь того же результата, что и ме­
                                .
       тод apply. В экземпляре нашего метода update, в котором значение this действи­
       тельно важно, мы все еще должны использовать метод call, но для функций Math .
       rnin и Math . rn ax, для которых оно не имеет значения, мы можем использовать опера­
       тор расширения, чтобы вызвать эти функции непосредственно.
       const  newBruce  =  [  9 4 0 ,   "martial  artist " ] ;
                         1
                                  c
       update . call ( b ruce,  . . .   newBru e ) ;  / /  эквивалент  apply (bruce,  пewBruce)
                .
       Math . m in (  . .   arr ) ;    //  -5
       Math . m ax (  . .   arr ) ;    //  1 5
                .
          Есть еще одна функция, Ьind, которая позволяет определить значение для пе­
       ременной  thi s .   Функция  Ьind  позволяет перманентно  ассоциировать  значение
       для this с функцией. Предположим, что  мы распространяем свой метод update



       1 4 2    Глава 6. Функции
   137   138   139   140   141   142   143   144   145   146   147