假设我有JS代码的以下部分:
const v = 3;
据我所知,它可以解析为AssignmentExpression:
AssignmentExpression :
LeftHandSideExpression = AssignmentExpression
现在我想知道它是如何从语句中派生出来的?一种可能的途径是:
Statement -> ExpressionStatement -> Expression -> AssignmentExpression
但我不确定。这是正确的吗?
以下是我的发现:
AssignmentExpression
是部分表达式:
Expression :
AssignmentExpression
Expression, AssignmentExpression
则Expression
是表达式的一部分语句是
ExpressionStatement:
[lookahead ∉ { {, function, ..., let [ }] Expression;
然后ExpressionStatement
是Statement:的一部分
Statement :
ExpressionStatement
const v = 3;
是一个声明,而不是赋值。有趣的是,声明不是Statement
s,但可以出现在StatementList
s中。因此,不能从Statement
派生const v = 3;
,但可以从StatementList
派生。因此,如果您有一个只包含const v = 3;
的脚本,那么完整的推导将是:
Script
|
ScriptBody
|
StatementList
|
StatementListItem
|
Declaration
|
LexicalDeclaration
/ |
LetOrConst BindingList ';'
| |
'const' LexicalBinding
/
BindingIdentifier Initializer
| |
Identifier AssignmentExpression
| |
IdentifierName ...
| |
'v' '5'
实际的分配将只是v = 5;
。这将通过ExpressionStatement
,从Statement
导出的结果如下:
Statement
|
ExpressionStatement
/
Expression ';'
|
AssignmentExpression
/ |
LeftHandSideExpression '=' AssignmentExpression
| |
NewExpression ...
| |
MemberExpression '5'
|
PrimaryExpression
|
IdentifierReference
|
Identifier
|
IdentifierName
|
'v'