在编写一个异步生成器函数时,我注意到以下结构会导致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
则不需要特殊处理?涉及到的是ECMAScript 2018中哪些具体的静态语义。