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

Для ясности: объект о в функции не зависит от объекта о за пределами функции,
       но оба они обращаются к одному  и тому же объекту. Мы можем увидеть это раз­
       личие снова в присваивании.
       function  f  ( o )
           o . m essage  =  "Изменено  в  f " ;
           о  =
               message :  "Новый  объект ! "
           } ;
                 g
       console . l o ( ' Bнyтpи  f  :   o . m essage=" $ { o . m es sage } "   ( п осле  присваивани ) ' ) ;
                                                                      я
       }
       let  о  =  {
           message :  ' Н ачальное  значение '
       } ;
       console . l o ( ' Пepeд  вызовом  f  :   o . m essage=" $ { o . messag } " ' ) ;
                                                        e
                 g
       f ( о ) ;
                                                       e
       console . l o ( ' П ocлe  вызова  f :   o . message " $ { o . m e s sag } "  ' ) ;
                 g
                                            =
          Если запустить этот пример, то можно увидеть
       Перед  вызовом  f :   о . m е s sаgе="Начальное  значение "
       Внутри  f :   o . m essage="Hoвый  объект ! "   (после  присваивания)
       После  вызова  f :   o . m es sage="  Изменено  в  f "
          Ключом к пониманию происходящего здесь является то, что а р гумент о  (в функ­
       ции) - это вовсе не переменная о за пределами функции. При вызове f оба указыва­
       ют на один и тот же объект, но когда о присваивается объект внутри f, оно начинает
       указывать на новый,  независимый объект, а о вне функции все еще продолжает ука­
       зывать на первоначальный объект.

                  Базовые типы в  JavaScript считаются  типами значения (value type),
                  как и во всех других языках программирования, поскольку при пере­
                  даче по значению они копируются.  Объекты называют ссылочными
                  типами (reference type), поскольку при их передаче по ссылке обе пе­
                  ременные продолжают ссылаться на один и тот же объект (т.е. обе
                  они содержат ссылку на тот же объект).

       Определяют ли        а р г  ументы функцию?
          Во многих языках в сигнатуру (signature) функции включаются ее аргументы. На­
                                                                           (
       пример, в языке С функция f ( )  (без аргументов) отличается от функции f  х )   (с од­
                                                                      (
       ним аргументом), которая в свою очередь отличается от функции f  х ,   у )   (с двумя
       аргументами). В языке JavaScript такого различия нет, и  когда у вас есть  функция
       по имени f, можете вызывать ее без аргументов, с одним аргументом или с десятью
       аргументами (причем вы всегда вызовете одну и ту же функцию).




                                                             Аргументы функции   1 3 3
   128   129   130   131   132   133   134   135   136   137   138