在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/ 。