Найти в Дзене
Илья Дмитриев

JavaScipt. Урок №29. Замыкания

Что бы понять что такое замыкания в javaScript необходимо наглядно изучить пример. Создадим переменную number, снаружи функции: Если вызвать функцию func - то она сначала увеличит переменную number на единицу после чего вернет новое значение number: При вызове функции каждый раз она будет выводить на единицу больше. В нашем примере переменная number находится в глобальной области видимости. Из-за этого другая функция может случайно затереть number и функция func перестанет давать правильный результат. Чтобы этого не случилось необходимо написать переменную number внутри функции. Создадим новую функцию counterNum вокруг функции func а саму функцию func сделаем анонимной. При этом функция counterNum будет возвращать эту анонимную функцию. Рассмотрим подробнее, что тут происходит: переменная number является локальной внутри функции counterNum, но при этом она доступна в анонимной функции (это мы видели в предыдущих примерах). В строчке const counter = counterNum() анонимная функция за

Что бы понять что такое замыкания в javaScript необходимо наглядно изучить пример.

Создадим переменную number, снаружи функции:

-2

Если вызвать функцию func - то она сначала увеличит переменную number на единицу после чего вернет новое значение number:

-3

При вызове функции каждый раз она будет выводить на единицу больше.

-4

В нашем примере переменная number находится в глобальной области видимости. Из-за этого другая функция может случайно затереть number и функция func перестанет давать правильный результат. Чтобы этого не случилось необходимо написать переменную number внутри функции.

Создадим новую функцию counterNum вокруг функции func а саму функцию func сделаем анонимной. При этом функция counterNum будет возвращать эту анонимную функцию.

-5

Рассмотрим подробнее, что тут происходит: переменная number является локальной внутри функции counterNum, но при этом она доступна в анонимной функции (это мы видели в предыдущих примерах). В строчке const counter = counterNum() анонимная функция запишется в переменную counter. Получится, что у нас далее есть функция counter, внутри которой доступна переменная number из counterNum.

-6

Теперь давайте вызовем функцию counter несколько раз и каждый раз она будет возвращать на единицу больше:

-7

Особенностью такого подхода является то, что переменная number не видна снаружи createNum и ее невозможно ненароком изменить. Вне функции createNum она не видна и добраться до нее можно только через функцию counter. Это и называется замыкание.

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

Теперь самое интересное:

Если createNum записать в разные переменные и вызвать пару раз, то каждая из них станет отдельным счетчиком.

В примере 2 функции: counter1и counter2 - и они работают отдельно друг от друга то есть у каждой из них своя переменная number

-8

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

-9

Реализуйте этот пример и понажимайте на кнопки.