在我的代码中,我可以归结为以下几点:
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稳定版中对此进行了测试。)
这个是正常的。与function表达式不同,表达式是像其他文字和标识符一样的PrimaryExpression,而箭头函数专门是AssignmentExpression,并且只能出现在分组,逗号,赋值,条件(三元)和yield表达式内。除此以外的任何其他运算符都将导致歧义。
例如,如果您希望y || ()=>z工作,那么也()=>z || y应该工作(假设对称优先级)。但是,这显然与我们的期望相冲突,即我们可以在简明的箭头函数体内使用任何运算符。因此,这是一个语法错误,需要显式分组才能起作用并保持可维护性。