Всем привет, сегодня мы продолжим тему прошлого поста и перейд | 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. Мы, например, не можем её поменять — только вывести в консоль.
Грубо говоря, мы создали функцию, которая даёт нам читать переменные, но не изменять их. Это полезно, если мы хотим дать ограниченный доступ к внутренностям модуля.
Более подробную статью о замыканиях, Вы можете прочитать по ссылке
Если у вас появились вопросы, ждем их в комментариях!