在OR赋值中围绕yield表达式的括号需要括号的确切语法歧义是什么?

Shi*_*umi 5 javascript yield node.js ecmascript-6

以下代码...
假设yield是在生成器函数内部,something并且else已定义,等等.

const value = something || yield else();
Run Code Online (Sandbox Code Playgroud)

...在V8(Chrome或Nodejs)中生成以下内容:

                const start = initial || yield wait();
                                         ^^^^^
SyntaxError: Unexpected strict mode reserved word
Run Code Online (Sandbox Code Playgroud)

...这在Firefox中:

SyntaxError: yield is a reserved identifier
Run Code Online (Sandbox Code Playgroud)

我第一次注意到这是在我写的蓝鸟 协程中.解决方法是将yield wait()括号括起来.

此错误发生在分析时而不是执行时; 所以,我的第一个假设是,这是因为这里存在句法模糊性.我查看了yield关键字,它将其定义为:

[rv] = yield [expression];
Run Code Online (Sandbox Code Playgroud)

yield接受一个表达式并返回一个值.如果没有||(OR)运算符,就不会发生这种情况const value = yield else();; 所以,我查看了运算符优先级.的||(OR)运算符在评价5的前yield在操作者2.优先级看起来不错.

看起来||(OR)运算符需要在任何一侧使用表达式,而我认为这yield [expression] 一个表达式,也许这不是真的?为什么我需要将该部分包含在括号中以使其明确表达式?什么可能|| yield含糊不清?我确定我只是错过了它; 或者,是否有一些偷偷摸摸/更深层次的原因?

这个问题也很难找到,所以希望我不会在这里重复.

(如果您想看到它,可以使用此Plunker https://plnkr.co/edit/rNidnFuyIOFkRkkcyWRV来发生错误.)

谢谢!

Fel*_*ing 7

如果你想弄清楚语法规则,你必须看看规范.

LogicalOrExpression被定义为

LogicalANDExpression:
  BitwiseORExpression
  LogicalANDExpression && BitwiseORExpression

LogicalORExpression:
  LogicalANDExpression
  LogicalORExpression || LogicalANDExpression
Run Code Online (Sandbox Code Playgroud)

一个LogicalANDExpression只能包含BitwiseORExpression秒.但是YieldExpression不是BitwiseORExpression,它是一个AssignmentExpression:

AssignmentExpression:
  ConditionalExpression
  [+Yield] YieldExpression
  ArrowFunction
  LeftHandSideExpression = AssignmentExpression 
  LeftHandSideExpression AssignmentOperatorAssignmentExpression
Run Code Online (Sandbox Code Playgroud)

它基本上在表达式层次结构中更高:

                 +--------------------------+                
                 |   AssignmentExpression   |                
                 +--------------------------+                
                               ^                             
                               |                             
              +----------------+---------------+             
              |                                |             
              |                                |             
+--------------------------+     +--------------------------+
|  ConditionalExpression   |     |     YieldExpression      |
+--------------------------+     +--------------------------+
              ^                                              
              |                                              
              |                                              
+--------------------------+                                 
|   LogicalORExpression    |                                 
+--------------------------+                                 
              ^                                              
              |                                              
              |                                              
+--------------------------+                                 
|   LogicalANDExpression   |                                 
+--------------------------+                                 
              ^                                              
              |                                              
              |                                              
+--------------------------+                                 
|   BitwiseORExpression    |                                 
+--------------------------+   
Run Code Online (Sandbox Code Playgroud)

对于一个可能解释为什么语法结构是这样的是,yield也是一个有效的标识符名称(发电机或产量表现之外).但是有关详细信息,您可能需要在https://esdiscuss.org/上询问.