【问题标题】:Can not use 'yield' as identifier inside a generator不能在生成器中使用 'yield' 作为标识符
【发布时间】:2020-04-03 22:32:59
【问题描述】:

在编写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 括在括号中的AwaitExpression 中来更正语法,以避免将标记yield 解析为标识符而不是上下文关键字:

async function * foo() {
  await (yield bar); // OK
}

但这引出了一个问题,ECMAScript 2018 中的哪些特定静态语义导致yield 在此上下文中被解析为标识符,而await 不需要特殊处理?

【问题讨论】:

    标签: javascript syntax language-lawyer generator ecmascript-2018


    【解决方案1】:

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

    await 表达式被解析时,下一个提供给解析的标记用于形成UnaryExpression,而yield 的唯一选择是IdentifierReference(完全忽略@ 987654335@ 紧随其后)。当然,在不允许的生成器解析上下文中,会导致令人困惑的错误消息。

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

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2017-07-07
      • 2013-12-13
      相关资源
      最近更新 更多