может кто-нибудь объяснить мне, почему грамматика оператора for, while, do-while определяет, что часть условия в заголовке является "выражением"

Может ли кто-нибудь объяснить мне, почему грамматика оператора for, while, do-while определяет, что часть условия в заголовке является "выражением", и может ли кто-нибудь объяснить мне, что означает следующая вещь

Expression[In, Yield, Await] :
      AssignmentExpression[?In, ?Yield, ?Await]
      Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]

Как видите, литерала справа после нетерминального Expression[In, Yield, Await] : но все же можно писать литералы в заголовкеfor-statement, while-statement, do-while statement

for (var i = 0; null; i ++) {
             /* ^^^^ */
             /* null */   
}

while (null) {
    /* ^^^^ */
    /* null */
}

do {} while (null) ; 
          /* ^^^^ */
          /* null */

И также можно записывать выражения функций в заголовке этих операторов, даже если FunctionExpression не присутствует в правой части нетерминального Expression[In, Yield, Await] :

for (var i = 0; function () {}; i ++) ;
             /* ^^^^^^^^^^^^^^ */
             /*  functionExpr  */

while (function () {}) ;
    /* ^^^^^^^^^^^^^^ */
    /*  functionExpr  */
    
do ; while (function () {}) ;
         /* ^^^^^^^^^^^^^^ */
         /*  functionExpr  */
         

1 ответ

Решение

Я поискал в документации, но то, что я нашел (вкратце):

Expression: 
    AssignmentExpression

Затем, среди прочего:

AssignmentExpression: 
    LeftHandSideExpression

Итак, мы можем углубиться во вложение:

LeftHandSideExpression: 
    NewExpression

NewExpression: 
    MemberExpression

MemberExpression: 
    PrimaryExpression

И узнайте, что PrimaryExpression содержит много других элементов, кроме Literal и FunctionExpression:

PrimaryExpression[Yield, Await]:
     this
     IdentifierReference[?Yield, ?Await]
     Literal
     ArrayLiteral[?Yield, ?Await]
     ObjectLiteral[?Yield, ?Await]
     FunctionExpression
     ClassExpression[?Yield, ?Await]
     GeneratorExpression
     AsyncFunctionExpression
     AsyncGeneratorExpression
     RegularExpressionLiteral
     TemplateLiteral[?Yield, ?Await, ~Tagged]
     CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]

Надеюсь, мой ответ достаточно ясен и проясняет ваши сомнения

Другие вопросы по тегам