Замыкания в JavaScript

«Замыкание (closures) это функция вместе со всеми внешними переменными, которые ей доступны», — таково стандартное определение, которое есть в Wikipedia и большинстве серьёзных источников по программированию. То есть, замыкание — это функция + внешние переменные. Но замыкания куда интереснее, если капнуть глубже.

Тем не менее, в JavaScript есть небольшая терминологическая особенность. Обычно, говоря «замыкание функции», подразумевают не саму эту функцию, а именно внешние переменные. Иногда говорят «переменная берётся из замыкания». Это означает — из внешнего объекта переменных.

Лучше всего замыкания сделаны в js. «Понимать замыкания» в JavaScript означает понимать следующие вещи:

  • Все переменные и параметры функций являются свойствами объекта переменных LexicalEnvironment. Каждый запуск функции создает новый такой объект. На верхнем уровне им является «глобальный объект», в браузере — window.
  • При создании функция получает системное свойство Scope, которое ссылается на LexicalEnvironment, в котором она была создана.
  • При вызове функции, куда бы её ни передали в коде — она будет искать переменные сначала у себя, а затем во внешних LexicalEnvironment с места своего «рождения».

Links

  • https://learn.javascript.ru/closures