不能在生成器内部使用'yield'作为标识符

问题描述 投票:3回答:1

[组成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不需要特殊处理?

javascript syntax language-lawyer generator ecmascript-2018
1个回答
0
投票

这是yield的问题,其中await(并有一个作为其操作数),与precedence of the await operator运算符有await(并有一个作为其可选操作数)不同。 forms a UnaryExpression不会形成UnaryExpression,这意味着根本不允许您像这样嵌套它们。

当解析yield表达式时,馈入解析的下一个标记用于形成forms an AssignmentExpression,并且AssignmentExpression要做的唯一选择是作为AssignmentExpression(完全忽略UnaryExpression ]之后)。当然,在不允许的生成器解析上下文中,会导致令人困惑的错误消息。

请注意,两种形式的嵌套(awaitUnaryExpression)都完全没有必要,因为异步生成器函数中的yield关键字已经等待了屈服值和恢复值IdentifierReference,所以您应该只忽略bar关键字,而仅使用await (yield …)

© www.soinside.com 2019 - 2024. All rights reserved.