[组成async generator函数时,我注意到以下构造导致SyntaxError
:
async function * foo() {
await yield bar; // Can not use 'yield' as identifier inside a generator
}
即使颠倒上下文关键字的顺序是完全可以接受的:
async function * foo() {
yield await bar; // OK
}
[仔细阅读错误后,我可以通过将UnaryExpression
括在圆括号中来避免语法[_C0]作为标识符而不是上下文关键字的解析,从而纠正了语法问题:
AwaitExpression
但这引出了一个问题,yield
中涉及哪些特定的静态语义,在这种情况下,async function * foo() {
await (yield bar); // OK
}
被解析为标识符,而ECMAScript 2018不需要特殊处理?
这是yield
的问题,其中await
(并有一个作为其操作数),与precedence of the await
operator运算符有await
(并有一个作为其可选操作数)不同。 forms a UnaryExpression
不会形成UnaryExpression
,这意味着根本不允许您像这样嵌套它们。
当解析yield
表达式时,馈入解析的下一个标记用于形成forms an AssignmentExpression
,并且AssignmentExpression
要做的唯一选择是作为AssignmentExpression
(完全忽略UnaryExpression
]之后)。当然,在不允许的生成器解析上下文中,会导致令人困惑的错误消息。
请注意,两种形式的嵌套(await
和UnaryExpression
)都完全没有必要,因为异步生成器函数中的yield
关键字已经等待了屈服值和恢复值IdentifierReference
,所以您应该只忽略bar
关键字,而仅使用await (yield …)
。