Что такое допустимое левостороннее выражение в грамматике JavaScript?



Хорошо, мы все знаем, Что такое допустимые выражения левой стороны. Вроде.*



Но, глядя на определение из стандарта ECMA-Script , я очень запутался:



LeftHandSideExpression :
NewExpression
CallExpression


Это просто ошибка в определении, или я что-то неправильно понял? Я имею в виду, не означает ли это на самом деле, что



new Object = 1; // NewExpression AssignmentOperator PrimaryExpression
function () { return foo; }() = 1;// CallExpression AssignmentOperator PrimaryExpression


Должны ли быть допустимыми выражения присваивания?





* по моему скромному разумению, это было бы намного больше. смысл:



LeftHandSideExpression :
Identifier
MemberExpression [ Expression ]
MemberExpression . IdentifierName
CallExpression [ Expression ]
CallExpression . IdentifierName


551   2  

2 ответов:

Чтобы кратко ответить на ваш вопрос, все, что находится под LeftHandSideExpression производством, является действительным LeftHandSideExpression.


Я думаю, что вопрос, который вы действительно задаете, таков:

Что такое действительный LeftHandSideExpression и также присваиваемый?

Ответ на это-все, что разрешается в Reference, которое является хорошо определенным понятием в спецификации. В вашем примере
new Object = 1;

new Object является действительным LeftHandSideExpression, но оно не разрешается в Reference.

(new Object).x = 1;

Левая рука сторона-это MemberExpression . IdentifierName, которая согласно спецификации является последним шагом:

Возвращает значение типа Reference ...


Если вы считаете, что это 2 отдельных свойства, это имеет гораздо больше смысла.

  1. является ли это допустимым левосторонним выражением?
  2. является ли это допустимой ссылкой?
Свойство 1 определяется на этапе синтаксического анализа, а свойство 2-на этапе семантического анализа. Проверить 8.7.2 PutValue (V, W) для более подробной информации.

Вот полное объяснение в самой спецификации:

8.7 Тип Спецификации Ссылки

Ссылочный тип используется для объяснения поведения таких операторов, как delete, typeof и операторы присваивания. Например, предполагается, что левый операнд присваивания создает ссылку. Вместо этого поведение присваивания может быть объяснено полностью в терминах анализа падежа синтаксической формы. левого операнда оператора присваивания, но с одной трудностью: вызовы функций разрешены для возврата ссылок. Эта возможность допускается исключительно ради объектов-хозяев. Никакая встроенная функция ECMAScript, определенная этой спецификацией, не возвращает ссылку, и нет никакого положения для определяемой пользователем функции, чтобы возвратить ссылку. (Еще одна причина не использовать синтаксический анализ падежей заключается в том, что он будет длительным и неудобным, затрагивая многие части текста. спецификация.)


Взглянув на ваше предложение, я полагаю, что оно отбросит некоторые допустимые выражения (примечание: Я не оправдываю это.)

function OuterObj() {
    this.Name = "Outer";
    this.InnerObj = function() {
        this.Name = "Inner";
    }
}

var obj; (obj = new new OuterObj().InnerObj).Name = "Assigned";

Это тот случай, когда NewExpression является важным

Это альтернативная грамматика JavaScript, которая будет соответствовать только допустимым LeftHandSideExpressions, то есть LeftHandSideExpressions, которые фактически присваиваются.

NewExpression :
    PrimaryExpression
    new NewExpressionQualifier Arguments
    new NewExpressionQualifier

NewExpressionQualifier :
    NewExpressionQualifier Qualifier
    NewExpression

CallExpression :
    NewExpression
    CallExpressionQualifier Arguments

CallExpressionQualifier :
    CallExpression
    CallExpressionQualifier Qualifier

LeftHandSideExpression :
    LeftHandSideExpression Qualifier
    CallExpression Qualifier
    Identifier
    ( LeftHandSideExpression )
    ( Expression , LeftHandSideExpression )

Qualifier :
    . IdentifierName
    [ Expression ]
Каждый аргумент, для которого выбор ассоциированного нового или вызывающего выражения неоднозначен, должен быть связан с ближайшим возможным новым выражением, которое в противном случае не имело бы соответствующих аргументов. Я думаю, что это одна из причин, почему существует как NewExpression, так и MemberExpression nonterminal в Грамматика JavaScript.

Comments

    Ничего не найдено.