Что такое замыкание?

Замыкание – это комбинация функции, связанной вместе (вложенной) со ссылками на ее окружающее состояние (лексическое окружение). Другими словами, замыкание дает вам доступ к области действия внешней функции из внутренней функции. В JavaScript замыкания создаются каждый раз, когда создается функция, во время создания функции.

В JavaScript каждая работающая функция, блок кода {...} и скрипт в целом имеют внутренний (скрытый) связанный объект, известный как лексическая среда.

Объект Lexical Environment состоит из двух частей:

  1. Запись среды — объект, в котором в качестве свойств хранятся все локальные переменные (и некоторая другая информация, например значение this).
  2. Ссылка на внешнее лексическое окружение, связанное с внешним кодом.

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

Замыкания также можно использовать для создания функций с состоянием, на возвращаемые значения которых может влиять их внутреннее состояние.

Примеры:

var add = (function () {
var counter = 0;
return function () {counter += 1; return counter}
})();

добавить();
добавить();
добавить(); // счетчик теперь равен 3