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