Понимание замыканий в JavaScript

На самом деле это намного проще, чем то, что вам пытаются сказать другие учебники.

Замыкание JavaScript - одна из тех тем, вокруг которых может быть трудно понять, просто из-за того, как это часто объясняется. Большинство руководств просто говорят вам, что это функция внутри функции, но на самом деле за всем этим скрывается более глубокий смысл.

«Написание на языке ECMAScript без понимания замыкания похоже на написание Java без понимания классов» - Дуглас Крокфорд, отец JSON

Давайте посмотрим на код ниже:

Однако приведенный выше код не очень эффективен. Он использует глобальную область видимости, и нет ничего, что могло бы защитить его от изменений.

Многие люди часто забывают, что JavaScript - это язык лексической области видимости. Это означает, что наследование перетекает внутрь. Переменная вне функции доступна для использования внутри функции, но не наоборот.

Вы не можете использовать значение, объявленное внутри функции вне ее.

Приведенный ниже код является закрытием, потому что x - это переменная, которая находится вне функции.

Однако тогда возникает вопрос: если закрытие - это потребление переменной вне функции, почему следующий код не является закрытием?

Вышеупомянутое не является завершением из-за того, как JavaScript оценивает оператор. Объем функции создается один раз, и для нее выделяется память. Обработка происходит до тех пор, пока не будет достигнут конец функции и память не будет освобождена. В этом упражнении не достигается постоянство, и вся созданная ценность теряется навсегда.

Однако, если вы заключите свою функцию в функцию, она создаст другую область видимости - своего рода кольцевую ограду вокруг вашего кода, которая сообщает JavaScript не уничтожать вашу функцию, когда она завершается.

Переменная счетчика в приведенном ниже коде становится закрытой переменной, потому что она находится за пределами вызываемой функции (т. Е. Приращения). В результате вы можете создавать неограниченное количество экземпляров функции со своим собственным набором уникальных значений.

Таким образом, переменная counter является закрытием в приведенном выше фрагменте кода.

В некотором смысле замыкания - это просто функции с сохраненными данными. Когда вы создаете замыкание, вы говорите JavaScript, чтобы он запомнил состояние вещей внутри вашей функции - и только используемые переменные считаются «замыканиями».

Это особенно полезно, потому что замыкания являются функциями с сохранением состояния, поскольку они запоминают данные своих частных переменных после вызова. Переменные являются частными, поскольку внешние функции не могут получить к ним доступ с явным вызовом доступа. Это позволяет всей функции быть автономной, а ее переменные защищены от нежелательного изменения.

Таким образом, замыкания в JavaScript - это способ кратко разделить код на модульный и автономный способ без необходимости явно создавать класс. Использование замыканий обеспечивает воспроизводимость в коде и уменьшает количество необходимых глобальных областей.

Написание замыканий - это больше, чем просто помещение функции внутрь другой функции. Это метод, используемый для создания переменных, которые защищены от внешних изменений, действительно изолированы от остальной части приложения и постоянно сохраняют состояние.

Давайте оставаться на связи и присоединяйтесь к моему еженедельному потрясающему списку информационных бюллетеней в Интернете. Спасибо за внимание.

Афинья