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

лексическая область видимости в JavaScript означает, что переменная, определенная вне функции, может быть доступна внутри функции, определенной после объявления переменной. Но обратное неверно. Переменные, определенные внутри функции, не будут доступны вне этой функции.

В приведенном выше коде строка номер 6,7,12 будет работать абсолютно нормально, но строка номер 11 выдаст ошибку «inside is not defined». Поскольку переменные, определенные внутри функции, не будут доступны вне этой функции.

Первоначально это было верно для всех переменных, объявленных в javascript,
но теперь у нас есть ключевые слова let и cont, которые не имеют лексической области видимости, вместо этого они имеют область видимости на уровне блока, т.е. они могут быть доступны в фигурных скобках либо в ней будут иметь функцию или какие-либо условные или простые скобки, они не могут быть доступны за пределами этого.

Здесь выполнение функции scoping () выдаст ошибку «inside is not defined».

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

Как мы знаем, в javascript все является объектом, обладающим некоторыми свойствами. закрытие - одно из свойств функции в javascript, которое сохраняет значение переменной вне ее области видимости.

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

если вы хотите проверить закрытие внутри функции, проверьте его с помощью console.dir (имя_функции).
например.

вы можете видеть, что функция, хранящаяся в переменной «c», имеет одно закрытие свойства и внутри него значение переменной «a» an.

Если вы думаете здесь, вы также получите закрытие свойства с переменной «a», тогда проверьте под консолью.

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

закрытие может отлично работать с let и const.

В приведенном выше коде мы получим закрытие в функции, хранящейся в переменной k.
закрытие b, потому что оно использует переменную b, которая объявлена ​​во внешней функции, то есть в функции sub ().