Замыкания в JavaScript
Замыкания — очень важная часть JavaScript, в основном разработчики, работающие с JS, не знакомы с этой терминологией. Давайте узнаем, что такое замыкания, на некоторых примерах. Замыкания создаются каждый раз при создании функции. Вот первый базовый пример, поэтому давайте исследуем
Вы уже заметили, что в функции initilizer() есть одна переменная и одна функция displayLanguage(), и обратите внимание, что оператор alert() в функции displayLanguage() успешно выводит значение переменной, которая находится в родительской области, и нет переменной в displayLanguage( ) функция. Это явление известно как лексическая область видимости.
В следующем коде показано, как использовать замыкания с общедоступными функциями, которые могут использовать частные функции и переменные.
Фрагменты кода выше показывают, что есть три общедоступные функции: increment, decrement и value и эти функции имеют единое лексическое окружение, каждое замыкание имеет собственное лексическое окружение.
Дело в том, что эта общая лексическая среда родилась в недрах анонимной функции. Если присмотреться, в функции тела есть переменная privateNumberи имя функции privateFunction() у обоих есть частная область, вы не можете получить доступ к этой частной функции или переменной вне функции, только общедоступные функции (увеличение, уменьшение) могут получить доступ к этим закрытым членам.
Эти общедоступные функции являются замыканиями и используют одно и то же лексическое окружение из-за благословения лексической области видимости JavaScript.
Давайте посмотрим на другой пример и исследуем, как вещи ведут себя в другой среде.
Я думаю, вы уже поняли, что два экземпляра работали независимо друг от друга. Каждое замыкание ссылается на другую версию переменной privateNumber с собственным замыканием. Технически оба имеют собственное лексическое окружение, поэтому изменение значения переменной в одном замыкании не влияет на значение в другом замыкании.
Одна вещь, которую я должен упомянуть, используя закрытие таким образом, вы можете воспользоваться преимуществами ООП (объектно-ориентированного программирования), в частности принципа инкапсуляции.