Получи случайную криптовалюту за регистрацию!

Всем привет, сегодня мы продолжим тему прошлого поста и перейд | WebCoder | Frontend

Всем привет, сегодня мы продолжим тему прошлого поста и перейдем к замыканиям.

Как мы выяснили, у область видимости функций ограничена ее телом. Но что если внутри одной функции будет дочерняя функция ?

function outer() {
let a = 42

function inner() {
console.log(a)
}

inner()
}

outer()
// 42

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

Заметим, что у функции inner никаких локальных переменных нет — она работает только с локальной переменной функции outer.

Такой особенный доступ к локальным переменным родительской функции часто называют лексической областью видимости.

Сокрытие «внутренностей» позволяет создавать независимые друг от друга блоки кода. Это, например, полезно, когда мы хотим запустить какой-то модуль в браузере с уверенностью, что он никак не повлияет на другой код.

Но что, если мы вернём из функции outer функцию inner?

function outer() {
let a = 42

function inner() {
console.log(a)
}

return inner
}

Теперь мы можем не просто вызывать функцию outer, но и присвоить результат вызова какой-то переменной:

const accessToInner = outer()

accessToInner()
// 42

Теперь в переменной accessToInner находится функция inner, у которой всё ещё есть доступ к локальной переменной a функции outer!

То есть мы смогли «обойти» область видимости? Не совсем.

Мы действительно получили доступ к переменной a через функцию inner, но только в том виде и с такими ограничениями, которые описаны при создании функции inner.

У нас всё ещё нет прямого доступа к переменной a. Мы, например, не можем её поменять — только вывести в консоль.

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

Более подробную статью о замыканиях, Вы можете прочитать по ссылке

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