Javascript 不能使用';收益率';作为生成器中的标识符

Javascript 不能使用';收益率';作为生成器中的标识符,javascript,syntax,language-lawyer,generator,ecmascript-2018,Javascript,Syntax,Language Lawyer,Generator,Ecmascript 2018,在编写函数时,我注意到以下构造会导致一个SyntaxError: async function * foo() { await yield bar; // Can not use 'yield' as identifier inside a generator } 即使颠倒上下文关键字的顺序也是完全可以接受的: async function * foo() { yield await bar; // OK } 仔细阅读错误后,我能够纠正语法,将UnaryExpression封装在Aw

在编写函数时,我注意到以下构造会导致一个
SyntaxError

async function * foo() {
  await yield bar; // Can not use 'yield' as identifier inside a generator
}
即使颠倒上下文关键字的顺序也是完全可以接受的:

async function * foo() {
  yield await bar; // OK
}
仔细阅读错误后,我能够纠正语法,将
UnaryExpression
封装在
AwaitExpression
的括号中,以避免将标记
yield
解析为标识符而不是上下文关键字:

async function * foo() {
  await (yield bar); // OK
}
但这就引出了一个问题,在这种情况下,
yield
被解析为标识符,而
await
不需要特殊处理,其中涉及哪些特定的静态语义(并且有一个作为其操作数),而
yield
运算符
AssignmentExpression
不构成
UnaryExpression
,这意味着不允许这样嵌套它们

解析
wait
表达式时,馈送到解析的下一个标记用于形成
UnaryExpression
,而
yield
的唯一选择是作为
标识引用(完全忽略它后面的
)。当然,在不允许的生成器解析上下文中,会导致错误消息混乱

请注意,这两种嵌套形式(
await(yield…
yield(await…
)无论如何都是完全不必要的,因为异步生成器函数中的
yield
关键字已经在等待产生的值和恢复值,所以您应该省略
wait
关键字,只使用
yield