在OR赋值中需要在yieldexpression式周围使用括号的确切语法歧义是什么?

下面的代码…
假定产量是在一个生成器函数内部,而else是被定义的等等。

 const value = something || yield else(); 

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

  const start = initial || yield wait(); ^^^^^ SyntaxError: Unexpected strict mode reserved word 

…这在Firefox中:

 SyntaxError: yield is a reserved identifier 

我首先注意到了我正在写的一个蓝鸟 协程 。 解决方法是将yield wait()放在括号中。

这个错误发生在parsing时间而不是执行时间。 所以,我的第一个假设是,这是因为这里有一个句法模糊。 我看了一下yield关键字 ,它将其定义为:

 [rv] = yield [expression]; 

yield接受一个expression式并返回一个值。 这不会发生|| (OR)运算符为const value = yield else(); ; 所以,我看着运营商的优先 。 || (OR)运算符在2之前在yield运算符之前评估。 优先顺序看起来不错。

它看起来像|| (OR)运算符需要在任何一方expression,而我认为yield [expression] 一个expression式,也许这是不正确的? 为什么我需要用圆括号来包装这个部分来明确expression一个expression式呢? 什么可以|| yield || yield暧昧与? 我确定我只是想念它; 或者,是否有一些偷偷摸摸/更深的原因呢?

这个问题也是臭名昭着的难以search,所以希望我不要在这里复制。

(如果你想看,你可以使用这个Plunker https://plnkr.co/edit/rNidnFuyIOFkRkkcyWRV来使错误发生。)

谢谢!

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

LogicalOrExpression被定义为

 LogicalANDExpression: BitwiseORExpression LogicalANDExpression && BitwiseORExpression LogicalORExpression: LogicalANDExpression LogicalORExpression || LogicalANDExpression 

LogicalANDExpression只能包含BitwiseORExpression 。 但是一个YieldExpression不是一个BitwiseORExpression ,它是一个AssignmentExpression

 AssignmentExpression: ConditionalExpression [+Yield] YieldExpression ArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperatorAssignmentExpression 

它基本上是在expression层次上更高:

  +--------------------------+ | AssignmentExpression | +--------------------------+ ^ | +----------------+---------------+ | | | | +--------------------------+ +--------------------------+ | ConditionalExpression | | YieldExpression | +--------------------------+ +--------------------------+ ^ | | +--------------------------+ | LogicalORExpression | +--------------------------+ ^ | | +--------------------------+ | LogicalANDExpression | +--------------------------+ ^ | | +--------------------------+ | BitwiseORExpression | +--------------------------+ 

为什么以这种方式构造语法的一个可能的解释是yield也是一个有效的标识符名称(在生成器或yieldexpression式之外)。 但是更多的细节你可能想问一下https://esdiscuss.org/