Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   тест (https://javascript.ru/forum/offtopic/1927-test.html)

Zeroglif 08.10.2008 14:23

Цитата:

Сообщение от ZoNT
Соответственно никакой пользы от var f= func... vs function f()... нет

Дело не в пользе, а в том, что действительно различия есть:

1) время создания функции, FD как и переменная создаётся (наполняется значением) сразу же, а FE в рантайм;
2) опциональное имя для FE, когда согласно ES создаётся свой спецобъект, встраиваемый в scope chain;
3) зависимость от места обитания, FE c именем именно потому FE, а не FD, ибо находится там, где может быть выражение;
4) разная реализация FE в трёх основных браузерах.

Цитата:

Сообщение от ZoNT
случайно разделит его по разным блокам

Обычно никто не вызывает после объявления (хотя можно), а уж вызывать раньше да ещё из-под другого блока - это из серии "обращение к элементу до его загрузки", только гораздо менее распространено...

Dmitry A. Soshnikov 08.10.2008 14:35

Zeroglif, о! =) приветствую и на этом форуме ;)

Цитата:

Сообщение от Zeroglif
2) опциональное имя для FE, когда согласно ES создаётся свой спецобъект, встраиваемый в scope chain;

это имеется в виду спецобъект для "моментального" вызова FE? и после этого (возможного) вызова, этот спецобъект удаляется из variable object'a, да?

Zeroglif 08.10.2008 15:15

Цитата:

Сообщение от Dmitry A. Soshnikov
это имеется в виду спецобъект для "моментального" вызова FE?

не для "моментального", а просто для обращения из функции к ней же по её (опциональному) имени, вот тут в конце немного обсуждали...

Цитата:

Сообщение от Dmitry A. Soshnikov
этот спецобъект удаляется из variable object'a, да?

Не удаляется и не из variable object-a. С каждым вызовом создаётся родной для функции Variable object, а всё что в стеке ниже статично и приходит из [[Scope]] (не путать со Scope), то есть спецобъект живёт в первоначальном с момента создания виде, как и все "чужие" для функции Variable objects в цепочке.

Dmitry A. Soshnikov 08.10.2008 15:49

Цитата:

Сообщение от Zeroglif
не для "моментального", а просто для обращения из функции к ней же по её (опциональному) имени

эм.. ну да, а когда функция может обратиться сама к себе: рекурсивно (раз) и (я образно обозвал) - "моментально" (два), т.е. (function() {})(); ну да, это я имел в виду

Цитата:

Сообщение от Zeroglif
Не удаляется и не из variable object-a.

а-а, т.е. он спецобъект сидит в скоп чейне, рядом с другими variable object'aми. Все, понял =) спасибо )

Цитата:

Сообщение от Zeroglif
[[Scope]] (не путать со Scope)

в смысле? [[Scope]] - скоп-чейн (набор variable object'ов + спецобъекты (их же может быть несколько) FE). А под Scope'ом что имеется в виду в данном случае?

Zeroglif 08.10.2008 16:42

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 возвращается к своему первоначальному состоянию, чтобы спецобъект не влиял на другие функции...

Dmitry A. Soshnikov 08.10.2008 23:50

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.

Цитата:

Сообщение от Zeroglif
спецобъект принудительно добавляется к Scope только на момент создания именованной FE

И этот спецобъект создается только для именованной FE (чтобы иметь возможность обратиться из самой FE по имени). Для анонимных же FE данный спецобъект не заводится и обращение внутри FE возможно лишь через argumetns.callee. Я правильно уловил?

Цитата:

Сообщение от Zeroglif
спецобъект принудительно добавляется к Scope только на момент создания именованной FE

Scope .... на момент создания. Или [[scope]]? Только что я понял, что окончательный Scope (если так можно сказать) - скоп, в котором будет производится поиск, будет определен в момент вызова, а не создания. В момент создания Scope вообще получается не нужен. Да и в примере спецобъект находится в [[scope]]:

- Scope (scope chain) --> глобальный объект
- [[Scope]] функции --> спецобъект*, глобальный объект

Или я здесь не до конца понял?

Как всегда, спасибо за подробные разъяснения =)

Zeroglif 09.10.2008 10:16

Цитата:

Сообщение от Dmitry A. Soshnikov
И в сумме, это и есть Scope функции, так?

Именно так.
Цитата:

Сообщение от Dmitry A. Soshnikov
Или не правильная трактовка?

Двусмысленная, ты правильно уловил намёк на "родительский" scope, надо было "executed" заменить на "created" и всё.
Цитата:

Сообщение от Dmitry A. Soshnikov
Я правильно уловил?

Правильно.
Цитата:

Сообщение от Dmitry A. Soshnikov
Scope .... на момент создания. Или [[scope]]?

Из Scope в [[Scope]]!

Scope (scope chain) - это объекты, ассоциированные с контекстом исполнения, не с функцией. Когда мы говорим о scope chain мы должны говорить только о контексте. При создании любой функции "запоминается" scope chain того контекста, где она создана, то есть scope chain сохраняется в [[Scope]]... навсегда. Но в этом scope chain нет спецобъекта, а он очень нужен именованной FE, поэтому при создании такой функции в Scope временно добавляется спецобъект и тут же удаляется оттуда, как только функция запомнит это в [[Scope]]. Таким образом после создания для всех остальных функций scope chain выглядит как обычно.
Цитата:

Сообщение от Dmitry A. Soshnikov
В момент создания Scope вообще получается не нужен.

[[Scope]] черпает информацию из Scope в момент создания.

Dmitry A. Soshnikov 09.10.2008 17:01

Zeroglif, ага, понял, thx =)

толкько вот:

Цитата:

Сообщение от Zeroglif
надо было "executed" заменить на "created" и всё

как же просто заменить, если это определение из ecma?

Dmitry A. Soshnikov 09.10.2008 17:29

Цитата:

Сообщение от ZoNT
Соответственно никакой пользы от var f= func... vs function f()... нет.

ну, если говорить не об отличиях, а о пользе - то это создание функций в рантайме

Zeroglif 09.10.2008 17:29

Цитата:

Сообщение от Dmitry A. Soshnikov
как же просто заменить, если это определение из ecma?

Там много двусмысленных определений, точный смысл которых раскрывается непосредственно в описании алгоритмов, такова уж плата за обобщения. ;)


Часовой пояс GMT +3, время: 06:13.