Цитата:
1) время создания функции, FD как и переменная создаётся (наполняется значением) сразу же, а FE в рантайм; 2) опциональное имя для FE, когда согласно ES создаётся свой спецобъект, встраиваемый в scope chain; 3) зависимость от места обитания, FE c именем именно потому FE, а не FD, ибо находится там, где может быть выражение; 4) разная реализация FE в трёх основных браузерах. Цитата:
|
Zeroglif, о! =) приветствую и на этом форуме ;)
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
|
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 возвращается к своему первоначальному состоянию, чтобы спецобъект не влиял на другие функции... |
Zeroglif,
Т.е. [[scope]] - это набор объектов, которые уже однозначно прописаны при создании функции. Эти объекты (родительские varibale object'ы и (возможные) спецобъекты) всегда будут приплюсованы к varible object'у функции в момент вызова. И в сумме, это и есть Scope функции, так? Scope = variable object + [[scope]] 1. function F() {}; // создание Функция F получила внутреннее свойство [[scope]] (по определению "[[scope]] - A scope chain that defines the environment in which a Function object is executed.") - в котором функция запущена - явно указывается, что это нечто родительское, поскольку сама функция находится в этом нечто. Или не правильная трактовка? 2. F(); // вызов Для функци F динамически создается Scope (настоящий скоп чейн), который, как было сказано выше, состоит из variable object'a (это будет первый элемент Scope'a) и [[scope]]'a. Цитата:
Цитата:
- Scope (scope chain) --> глобальный объект - [[Scope]] функции --> спецобъект*, глобальный объект Или я здесь не до конца понял? Как всегда, спасибо за подробные разъяснения =) |
Цитата:
Цитата:
Цитата:
Цитата:
Scope (scope chain) - это объекты, ассоциированные с контекстом исполнения, не с функцией. Когда мы говорим о scope chain мы должны говорить только о контексте. При создании любой функции "запоминается" scope chain того контекста, где она создана, то есть scope chain сохраняется в [[Scope]]... навсегда. Но в этом scope chain нет спецобъекта, а он очень нужен именованной FE, поэтому при создании такой функции в Scope временно добавляется спецобъект и тут же удаляется оттуда, как только функция запомнит это в [[Scope]]. Таким образом после создания для всех остальных функций scope chain выглядит как обычно. Цитата:
|
Zeroglif, ага, понял, thx =)
толкько вот: Цитата:
|
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 06:13. |