Я услышал название «JavaScript» в 2009 году, когда учился в 8 классе. Я просто копировал и вставлял код, загружая код с какого-то веб-сайта и вставляя его. Я понятия не имею, что это будет одним из моих компаньонов позже в жизни. Мы все что-то знаем о JavaScript, но для большинства разработчиков основная часть того, как работает Javascript под капотом, находится за пределами этого мира, и я был одним из них. Поэтому я решил углубиться в его концепцию.

Википедия определяет замыкания как:

В языках программирования замыкание, а также лексическое замыкание или закрытие функции — это метод реализации связывания имен с лексической областью видимости. на языке с первоклассными функциями. Оперативно замыкание — это запись, хранящая функцию [a] вместе с окружением.

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

Теперь в Javascript есть еще одна приятная особенность: вы можете возвращать функцию из другой функции. Это также связано с тем, что функции являются гражданами первого класса в javascript. Когда мы возвращаем функцию из другой функции, мы получаем что-то удивительное, называемое замыканиями. Дайте мне минуту, чтобы объяснить это через CODE.

// foo is a higher order function which accepts two parameters
// 1. An integer n 
// 2. A callback function callback
function foo(n){
 function callback(){
     return n++ 
 } 
  return callback;
}
my_returned_function = foo(10)
console.log(my_returned_function())
//* Prints 11 
console.log(my_returned_function())
//* Prints 12 

Как видно из приведенного выше примера, функция каким-то образом собиралась запомнить, какое значение она имела ранее. Это может быть сюрпризом для многих из вас, так как после завершения выполнения функции ее локальные переменные выходят за рамки (не доступны), но как, черт возьми, это произошло. Ответом на это является то, что называется свойством [[scope]]. Это свойство является скрытым. Возьмем аналогию: когда функция обратного вызова возвращается из foo, она автоматически получает рюкзак, содержащий переменные, находящиеся в ее области видимости. Поскольку переменная «n» была доступна для обратного вызова, когда она была определена внутри foo, она попадает в рюкзак. Вот почему, когда мы вызываем функцию my_returned_function два раза, она может получить эту переменную и изменить ее соответствующим образом.

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