Замыкания - это очень просто. Посмотрите на такую функцию: function myFunction(a, { var sum = a + b; return sum;}На самом деле внутри у неё, скрытно от вас, создался невидимый объект, в котором хранится переменная sum. Т.е. для интерпретатора (в нашем случае интерпретатор - это браузер) функция выглядит вот так: function myFunction(a, { invisibleObject.sum = a + b; return invisibleObject.sum;}После того как функция отработала вступает в дело "сборщик мусора", который освобождает память на компе, которую занял этот самый invisibleObject, чтобы у вас браузер и вообще винда не тормозили. Так вот, замыкание - это когда сборщик мусора этот самый invisibleObject не удаляет. Классический пример: var counter;function myFunction() { var start = 0; counter = function() { return start++; };}myFunction(); // вызываем функцию, чтобы инициализировать переменную counter// далее юзаем уже countercounter(); // 0counter(); // 1counter(); // 2 и т.д.Браузер не дурак и видит, что переменная start может ещё понадобится в будущем, так как она используется внутри counter, поэтому он этот самый infisibleObject после того как мы вызвали myFunction не удаляет. Это и называется замыкание. tl;dr Замыкание - это когда невидимый объект, в котором функция хранит локальные переменные не удаляется после того как функция отработает. P.S. Кстати, этим "невидимым объектом" был Альберт Эйнштейн LexicalEnvironment.