为什么带有空箭头功能(()=> {})的逻辑或运算符(||)导致SyntaxError?

5 javascript arrow-functions

在我的代码中,我可以归结为以下几点:

var x = y || ()=>{};
Run Code Online (Sandbox Code Playgroud)

(以防万一,我稍后再调用,x()并且y可能被定义为一个函数,也可能没有,所以我不希望抛出TypeError。)

由于某些原因,这会导致

SyntaxError:意外令牌)

为什么?我发现

var x = y || (()=>{});
Run Code Online (Sandbox Code Playgroud)

效果很好,但是

y || ()=>{}
Run Code Online (Sandbox Code Playgroud)

没用。是否出现这种情况,还是V8或Chrome中存在错误?(我仅在最新版本的Chrome稳定版中对此进行了测试。)

Ber*_*rgi 8

这个是正常的。与function表达式不同,表达式是像其他文字和标识符一样的PrimaryExpression,而箭头函数专门是AssignmentExpression,并且只能出现在分组,逗号,赋值,条件(三元)和yield表达式内。除此以外的任何其他运算符都将导致歧义。

例如,如果您希望y || ()=>z工作,那么也()=>z || y应该工作(假设对称优先级)。但是,这显然与我们的期望相冲突,即我们可以在简明的箭头函数体内使用任何运算符。因此,这是一个语法错误,需要显式分组才能起作用并保持可维护性。