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.
Такий порядок пошуку можливий завдяки тому, що посилання на
зовнішній об'єкт змінних зберігається в спеціальному внутрішньому