Сообщение от 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 - правильное поведение, в остальных (пока) - неправильное.