Scope - это цепь объектов, опрашиваемых при вычислении идентификатора (scope chain), а [[Scope]] - это "закладка" на объекты, которые войдут в будущем (при исполнении функции) в состав Scope. Возьмём обыкновенную FunctionDeclaration, стоящую лексически в глобальном коде.
В момент её создания (при исполнении глобального кода):
- контекст исполнения --> контекст исполнения глобального кода
- Scope (scope chain) --> глобальный объект
- [[Scope]] функции --> глобальный объект
В момент вызова функции:
- контекст исполнения --> контекст исполнения функции
- Scope (scope chain) --> Variable object, глобальный объект
- [[Scope]] функции --> глобальный объект
Возьмём именованную FunctionExpresion там же, в глобальном коде:
В момент её создания (при исполнении глобального кода):
- контекст исполнения --> контекст исполнения глобального кода
- Scope (scope chain) --> глобальный объект
- [[Scope]] функции --> спецобъект*, глобальный объект
В момент вызова функции:
- контекст исполнения --> контекст исполнения функции
- Scope (scope chain) --> Variable object, спецобъект, глобальный объект
- [[Scope]] функции --> спецобъект*, глобальный объект
* спецобъект принудительно добавляется к Scope только на момент создания именованной FE исключительно для наполнения [[Scope]], после создания функции Scope возвращается к своему первоначальному состоянию, чтобы спецобъект не влиял на другие функции...
|