Показать сообщение отдельно
  #20 (permalink)  
Старый 24.03.2009, 22:03
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Gvozd
нет.это анонимная функция.
Точнее, Function Expression (FE). FE может быть и именованной функцией:

var a = function a() {...};


Основных отличий FE от FD (Function Declaration) два:

1. FE создаётся в рантайме (тогда как FD создается до построчного выполнения скрипта);
2. FE не воздействует на Variable object (VO) функции/контекста.

Первый пункт, вроде, и так все знают (кто более-менее знаком с JS). Однако, во многих статьях он описан поверхностно, и в основном FE приравнивается лишь к анонимной функции (что и создаёт путаницу). В то время как, разновидностей FE гораздо больше.

(function a() {...}); // это тоже, например, FE
alert(a); // как видим, на VO это не повлияло, и такой переменной нет - ошибка.


Сообщение от Gvozd
//создали новый контекст исполнения al(Person_) ;//нету еще никакой функции
Туда же относится (к FE). В скобках может быть только FE (не важно, что лексически они записаны в виде FD), поэтому функции будут созданы в рантайме, а не до начала выполнения скрипта. Кстати, это правильное (согласно стандарту) поведение сейчас можно наблюдать только в Firefox (в остальных браузерах - там будут построены FD).

Новый контекст исполнения здесь не создаётся. Однако, в новых версиях, блок из фигурных скобок может создавать отдельный scope (если интересно, почитайте про let на MDC и т.д.).

upd:

Сообщение от Gvozd
судя по всему в огнелисе в такой хитрой конструкции создается свой контекст, по правилам отличным от каких-либо стандартов.
Повторю, как раз-таки, наоборот. В Firefox - правильное поведение, в остальных (пока) - неправильное.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 24.03.2009 в 22:34. Причина: опечатки
Ответить с цитированием