Причиной, по которой вы можете получить доступ к «вне области» или «свободным» переменным в ECMAscript, является так называемая Scope chain .Цепочка контекста является специальным свойством каждого контекста выполнения .Как уже упоминалось несколько раз ранее, объект контекста выглядит как минимум:
- [[scope]]
- Переменная / объект активации
- «this» значение контекста
каждый раз, когда вы обращаетесь к переменной (-name) в контексте (например, к функции), процесс поиска всегда начинается в своем собственном Activation Object
.Все формальные параметры, объявления функций и локально определенные переменные (var) хранятся в этом специальном объекте.Если имя переменной не было найдено в этом объекте, поиск идет в [[Scope]]
-цепь.Каждый раз, когда функция (-context) инициализируется, она будет копировать все родительские контекстные переменные / объекты активации во внутреннее свойство [[Scope]]
.Это то, что мы называем лексическим охватом .Вот почему Closures работают в ECMAscript.Поскольку Global context
также имеет Variable Object
(точнее, ** переменным объектом для глобального объекта является сам глобальный объект), он также копируется в свойство [[Scope]] .
Именно поэтому вы можете получить доступ к window
из любой функции: -)
Приведенное выше объяснение имеет один важный концептуальный вывод: любая функция в ECMAscript является Closure , что правда.Поскольку каждая функция по крайней мере скопирует глобальный контекст VO в своем свойстве [[Scope]] .