Цитата:
|
2 Gvozd >
Насчет анонимных функций как-то еще нужно проверить ... И еще - ведь можно сделать var Person = function PPP ... // - результат не изменится !! PS . Что-то не получается меня со скобочками , опубликуйте пример, плз. |
читаем тут. http://javascript.ru/tutorial/basic/...aniie-funktsii
Gvozd, в вашем примере сначала выводится person который определен с помощью function(виден везде), а var Person еще не определен. После определения var Person заменяется соответствующая функция Person, и выводится новое значение |
function al(o){document.write(o,'<br>')} ;
al(Person) ;//здесь будет указана именованая функция.та, которая была объявлена последней
function Person() { al("zxc") } ;
al(Person) ;// та же ботва
var Person = function () {al("123")};
al(Person) ;//опаньки.появилась анонимная.ее и пишем
function Person() { al("qqq") } ;
al(Person) ; //та же ботва
al('-----------------') ;
{
//создали новый контекст исполнения
al(Person_) ;//нету еще никакой функции
function Person_() { al("zxc") } ;
al(Person_) ;//каждая новая функция переопределяет старую
var Person_ = function () {al("123")};
al(Person_) ;//каждая новая функция переопределяет старую
function Person_() { al("qqq") } ;
al(Person_) ; //каждая новая функция переопределяет старую
}
//судя по всему интепретатор сначала прогоняет глобальный контекст, на предмет наличия именованных функций, и создавая их
//причем в подконтексты он не лезет
//в памяти остается последняя из именованных функций
//потом неспеша строку за строкой выполняет программу, переопределяя по мере необходимости
//в подконтекстах то же самое, но без предвариловки с именованными функциями
PS IMHO. |
Цитата:
|
2 Gvozd > Дайте плз ссылку , в ECMA не нашел, не понял этой синтаксической структуры :
{
//создали новый контекст исполнения
// ....
}
|
http://javascript.ru/ecma/part10#a-10.1.3
Для объявленных функций: Цитата:
Цитата:
|
Цитата:
|
kefi,
блин даже не знаю. термин взял из головы. справки по тому что написал дать не могу, ибо теперь я не понимаю, почему оно так!) походу такое поведение не подчиняется каким-либо стандартам более того, поведение указанное мною в коментариях наблюдается только в мозилле. в остальных же все в порядке вещей, независимо от "контекста исполнения" согласно стандартам должно быть так: Цитата:
Код:
function Person() { al("qqq") }Код:
function Person() { al("qqq"); }протестируйте код ниже в огнелисе, и в другом браузере. реально странные вещи творятся у огнелиса
function al(o){document.write(o,'<br>')} ;
al(Person) ;//здесь будет указана именованая функция.та, которая была объявлена последней
function Person() { al("zxc") } ;
al(Person) ;// та же ботва
var Person = function () {al("123")};
al(Person) ;//опаньки.появилась анонимная.ее и пишем
function Person() { al("qqq") } ;
al(Person) ; //та же ботва
al('-----------------') ;
{
//создали новый контекст исполнения
al(Person_) ;//нету еще никакой функции
function Person_() { al("zxc_") } ;
al(Person_) ;//каждая новая функция переопределяет старую
var Person_ = function () {al("123_")};
al(Person_) ;//каждая новая функция переопределяет старую
function Person_() { al("qqq_") } ;
al(Person_) ; //каждая новая функция переопределяет старую
}
al('-----------------') ;
(function(){
//создали новый контекст исполнения
al(Person__) ;//нету еще никакой функции
function Person__() { al("zxc__") } ;
al(Person__) ;//каждая новая функция переопределяет старую
var Person__ = function () {al("123__")};
al(Person__) ;//каждая новая функция переопределяет старую
function Person__() { al("qqq__") } ;
al(Person__) ; //каждая новая функция переопределяет старую
})()
al('-----------------') ;
for(i=0;i<1;i++)
{
//создали новый контекст исполнения
al(Person__1) ;//нету еще никакой функции
function Person__1() { al("zxc__1") } ;
al(Person__1) ;//каждая новая функция переопределяет старую
var Person__1 = function () {al("123__1")};
al(Person__1) ;//каждая новая функция переопределяет старую
function Person__1() { al("qqq__1") } ;
al(Person__1) ; //каждая новая функция переопределяет старую
}
|
Цитата:
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 это не повлияло, и такой переменной нет - ошибка.
Цитата:
Новый контекст исполнения здесь не создаётся. Однако, в новых версиях, блок из фигурных скобок может создавать отдельный scope (если интересно, почитайте про let на MDC и т.д.). upd: Цитата:
|
| Часовой пояс GMT +3, время: 03:35. |