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

Да, как уже было отмечено (Kolyaj), в данном случае получается блок, а не инициализатор объекта (кстати, {} и [] правильно называются инициализатор объекта (object initializer) и инициализатор массива (array initializer) соответственно, а не литерал объекта, литерал массива).

Сообщение от Niar
Ты не понял {l:"l"} нету ошибки
Ошибка когда значение свойства-функция или когда имя свойства-строка
Здесь получается блок, в котором находится метка (label) и дальше выражения (statements).

{x: 10}


Равносильно:

{ // блок
  x: // метка
    10; // выражение
}


Результатом вычисления этого блока будет вычисление выражения, т.е. 10.

В случае:

{"x": 10}


опять имеем блок, но с неправильной меткой - ошибка синтаксиса.

В случае:

{x: funciton () {}}


имеем блок с правильной меткой, но с ошибочным statement-ом. Это равносильно простой записи:

funciton () {} // Syntax Error


которая будет являться FunctionDeclaration (FD) без имени, что ошибка. Поэтому:

{x: funciton a() {}} // OK


Но, за исключением того, что все браузеры, кроме Firefox трактуют эту функцию, как FD, которая будет создана ещё при входе в контекст (грубо говоря - доступна до объявления); Firefox же имеет своё расширение - FunctionStatement (FS), что означает, что функции в виде FD доступны в statement-ах и будут, правильно, созданы в рантайме (при интерпретации):

alert(a); // "a" is not defined - в FF, function - в остальных
{x: funciton a() {}}
alert(a); // function - везде (уже доступна для FF)


Можно к явному виду FunctionExpression (FE) привести, тогда функция будет создана в рантайме (кроме багов в IE и именованной FE):

{x: (funciton () {})} // OK
{x: (funciton a() {})} // OK, но в IE - будет FD+FE
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 01.02.2010 в 01:08.
Ответить с цитированием