Сообщение от kefi
|
И как это все Вы поняли из ECMA спецификации , ума не приложу ...
|
Несомненно, стоит отметить
этого человека - изначально, он помог мне поднять некоторые глубокие аспекты ("Этот человек", только ни в коем случае не считай это за лесть =) я просто благодарен и отдаю должное
). Углубляясь, изучая, дальше сам уже стандарт проштудировал (что и всем советую для профессионального понимания JavaScript).
Сообщение от kefi
|
Кстати контекст, как я сейчас понимаю, не является термином обозначающим некий объект, это чисто лексический контекст для текста функции или какого-ни слова из кода программы ?
|
Да, это абстракное определение, зависящее от типа кода:
Global code,
Eval code,
Function code.
Сообщение от kefi
|
Вот правда, еще остается непонятной роль AO - вроде как и нни к чему он
|
AO - это и есть VO. А VO, в свою очередь, можно тоже считать абстракцией. Физически же, эта абстракция представлена AO (для функции и eval'a) и Global - для Global'a. У Global'a нет arguments, поэтому для функции это назвали AO. Если говорить отстраннённо от JS, можно представить VO - как интерфейс, а AO и Global - как конкретные классы, реализующие этот интерфейс.
Сообщение от kefi
|
да еще какой-то непонятныйц остается спец объект
|
Спец.объект - "анонимный объект", который содержит одно единственное свойство - опциональное
имя FE, чтобы FE могла обратиться к себе рекрсивно по имени (помимо arguments.callee):
(function fn() {alert(fn);})();
Откуда alert(fn) выдаёт правильное значение, если FE не воздействуют на VO? Идентификатор fn не должен был попасть в VO(Global). Где же FE его находит? Специально для этого
перед созданием FE создаётся этот спец. объект и кладётся в scope chain (в данном случае Global):
Scope(Global).{}.fn = <reference to FE "fn">
Дальше, когда создалась FE "fn", этот спец. объект удаляется из Scope(Global) - теперь он есть в [[Scope]](fn) и, соотвественно, может быть найден.
Здесь ещё можно почитать.
Сообщение от kefi
|
- именно на [[Scope]] , т.е. БЕЗ VO функции d ?
|
update: VO и Scope создаются каждый раз при вызове функции; запоминается только [[Scope]](d).
Сообщение от kefi
|
- и сохраняются не просто , если возвращается return, как в Вашем примере b() , а если возвращаемое где-то сохранено var q=b()
|
Да, конечно, это тоже подразумевалось.