Page 90 - 6108
P. 90

Знову ж як і звичайна функція, яка негайно викликається, може повертати
               значення:
                     var result = (function (a, b) {
                          return a + b;
                     })(2, 5);
                     3.1.6 Замикання, область  видимості функції

                     Механізм  роботи  функцій  і  змінних  в  JavaScript  дуже  відрізняється  від
               більшості мов.
                     Глобальними  називають  змінні  і  функції,  які  не  перебувають  всередині
               якоїсь функції. Тобто, іншими словами, якщо змінна (крім змінних оголошених
               через  let)  або  функція  не  перебувають  всередині  конструкції  function,  то
               вони –  «глобальні».
                     В JavaScript  все глобальні змінні  і функції є  властивостями спеціального
               об'єкта, який називається «глобальний об'єкт» (global object).

                     У  браузері  цей  об'єкт  явно  доступний  під  ім'ям  window.  Об'єкт  window
               одночасно  є  глобальним  об'єктом  і  містить  ряд  властивостей  і  методів  для
               роботи з вікном браузера, але нас тут цікавить тільки його роль як глобального
               об'єкта.
                     В  інших  середовищах,  наприклад  Node.JS,  глобальний  об'єкт  може  бути
               недоступним  у  явному  вигляді,  але  суть  того,  що  відбувається  від  цього  не
               змінюється.
                     Привласнюючи  або  читаючи  глобальну  змінну,  фактично,  працюємо  з
               властивостями window.
                     Замикання  –  це  функції,  що  посилаються  на  глобальні  змінні,  які  не
               предаються  їх  в  якості  параметру.  Іншими  словами,  функція,  визначена  в
               замиканні, «запам'ятовує» оточення, в якому вона була створена.
                     Всі змінні всередині функції – це властивості спеціального внутрішнього
               об'єкта LexicalEnvironment, який створюється при її запуску.
                     При запуску функція створює об'єкт LexicalEnvironment, записує туди
               аргументи,  функції  та  змінні.  Процес  ініціалізації  виконується  в  тому  ж
               порядку,  що  і  для  глобального  об'єкта,  який,  взагалі  кажучи,  є  окремим
               випадком лексичного оточення.
                     На  відміну  від  window,  об'єкт  LexicalEnvironment  є  внутрішнім,  він
               прихований від прямого доступу.
                     З функції ми можемо звернутися не тільки до локальної змінної, але і до
               зовнішньої:

                     var userName = "Микола";
                     function sayHi () {
                       alert (userName); // "Микола"
                     }
                     Інтерпретатор, при доступі до змінної, спочатку намагається знайти змінну
               в поточному LexicalEnvironment, а потім, якщо її немає – шукає у зовнішньому
               об'єкті змінних. В даному випадку їм є window.

                     Такий  порядок  пошуку  можливий  завдяки  тому,  що  посилання  на
               зовнішній  об'єкт  змінних  зберігається  в  спеціальному  внутрішньому
   85   86   87   88   89   90   91   92   93   94   95