Не вдаваясь слишком глубоко в детали, closure
технически описывает array like variable
в так называемом Объекте активации , который обрабатывается из движка javascript.ActivationObject содержит переменных, объявленных var
, объявлениями функций и формальными параметрами .
Это означает, что в любое время новая функция (-context), внутри создается новый объект активации.Этот объект является частью нового Execution Context
, типичный EC выглядит следующим образом:
- эта переменная контекста
- Объект активации
- [[Scope]]
Интересная часть здесь - [[Scope]]
.Эта переменная содержит все объекты активации родительского контекста all и заполняется при вызове EC.Итак, теперь, когда функция хочет получить доступ к переменной, процесс разрешения имен сначала просматривает свой собственный объект активации, если ничего не найдено, поиск продолжается в «цепочке областей действия», которая является просто индексированным поиском через нашу [[Scope]] переменную (которая опять же является массивом родительских контекстов).Вот почему мы также много говорим о «лексической области видимости» в ECMA- / Javascript.
Примечание. Приведенное выше поведение не описано полностью, для этого потребуется несколько страниц текста.Также описывается спецификация ECMAscript3 262.В ES5 все немного по-другому, но все равно примерно одно и то же