Что такое допустимое левостороннее выражение в грамматике 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
2 ответов:
Чтобы кратко ответить на ваш вопрос, все, что находится под
LeftHandSideExpressionпроизводством, является действительнымLeftHandSideExpression.
Я думаю, что вопрос, который вы действительно задаете, таков:Ответ на это-все, что разрешается вЧто такое действительный
LeftHandSideExpressionи также присваиваемый?Reference, которое является хорошо определенным понятием в спецификации. В вашем примереnew Object = 1;
new Objectявляется действительнымLeftHandSideExpression, но оно не разрешается вReference.(new Object).x = 1;Левая рука сторона-это
MemberExpression . IdentifierName, которая согласно спецификации является последним шагом:Возвращает значение типа Reference ...
Если вы считаете, что это 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, так и MemberExpression nonterminal в Грамматика JavaScript.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 ]
Comments