Замыкание — это функция вместе со всеми внешними переменными, которые ей доступны.
Если объявить переменную вне функции, то она будет глобальной.
В JavaScript все глобальные переменные и функции являются свойствами специального объекта, который доступен под именем window. Присваивая или читая глобальную переменную, мы, фактически, работаем со свойствами window:

или

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

Пример полезности вложенности функций, создадим 2 независимых друг от друга счетчика через одну функцию:
