Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 08.10.2008, 14:23
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от ZoNT
Соответственно никакой пользы от var f= func... vs function f()... нет
Дело не в пользе, а в том, что действительно различия есть:

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

Сообщение от ZoNT
случайно разделит его по разным блокам
Обычно никто не вызывает после объявления (хотя можно), а уж вызывать раньше да ещё из-под другого блока - это из серии "обращение к элементу до его загрузки", только гораздо менее распространено...
Ответить с цитированием
  #32 (permalink)  
Старый 08.10.2008, 14:35
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

Сообщение от Zeroglif
2) опциональное имя для FE, когда согласно ES создаётся свой спецобъект, встраиваемый в scope chain;
это имеется в виду спецобъект для "моментального" вызова FE? и после этого (возможного) вызова, этот спецобъект удаляется из variable object'a, да?
__________________
Тонкости ECMAScript
Ответить с цитированием
  #33 (permalink)  
Старый 08.10.2008, 15:15
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

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

Сообщение от Dmitry A. Soshnikov
этот спецобъект удаляется из variable object'a, да?
Не удаляется и не из variable object-a. С каждым вызовом создаётся родной для функции Variable object, а всё что в стеке ниже статично и приходит из [[Scope]] (не путать со Scope), то есть спецобъект живёт в первоначальном с момента создания виде, как и все "чужие" для функции Variable objects в цепочке.
Ответить с цитированием
  #34 (permalink)  
Старый 08.10.2008, 15:49
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

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

Сообщение от Zeroglif
[[Scope]] (не путать со Scope)
в смысле? [[Scope]] - скоп-чейн (набор variable object'ов + спецобъекты (их же может быть несколько) FE). А под Scope'ом что имеется в виду в данном случае?
__________________
Тонкости ECMAScript
Ответить с цитированием
  #35 (permalink)  
Старый 08.10.2008, 16:42
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

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 возвращается к своему первоначальному состоянию, чтобы спецобъект не влиял на другие функции...
Ответить с цитированием
  #36 (permalink)  
Старый 08.10.2008, 23:50
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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]] функции --> спецобъект*, глобальный объект

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

Как всегда, спасибо за подробные разъяснения =)
__________________
Тонкости ECMAScript
Ответить с цитированием
  #37 (permalink)  
Старый 09.10.2008, 10:16
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от 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 в момент создания.
Ответить с цитированием
  #38 (permalink)  
Старый 09.10.2008, 17:01
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

толкько вот:

Сообщение от Zeroglif
надо было "executed" заменить на "created" и всё
как же просто заменить, если это определение из ecma?
__________________
Тонкости ECMAScript
Ответить с цитированием
  #39 (permalink)  
Старый 09.10.2008, 17:29
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от ZoNT
Соответственно никакой пользы от var f= func... vs function f()... нет.
ну, если говорить не об отличиях, а о пользе - то это создание функций в рантайме
__________________
Тонкости ECMAScript
Ответить с цитированием
  #40 (permalink)  
Старый 09.10.2008, 17:29
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от Dmitry A. Soshnikov
как же просто заменить, если это определение из ecma?
Там много двусмысленных определений, точный смысл которых раскрывается непосредственно в описании алгоритмов, такова уж плата за обобщения.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тест Redirect Общие вопросы Javascript 2 28.10.2008 00:08
Проблема обработки скрипта в Mozilla ermugard Firefox/Mozilla 2 18.06.2008 17:52
Новый тест Илья Кантор Сайт Javascript.ru 11 08.04.2008 18:04