为什么我们必须在es6箭头函数中用括号括起来

Avr*_*dis 4 javascript ecmascript-6

我想问一下有人知道原因

const fun = msg => throw new Error( msg ); JS是无效的

const fun = msg => { throw new Error( msg ); } 已验证

以来

const fun = msg => new Error( t ); 已验证

有人(我会)也希望这个案例throw是有效的JS.

这个选择背后有什么理由吗?例如它是否使翻译或其他事情变得困难?

Ori*_*iol 8

箭头函数定义如下:

ArrowFunction[In, Yield] :
    ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]

ConciseBody[In] :
    [lookahead ? { ] AssignmentExpression[?In]
    { FunctionBody }
Run Code Online (Sandbox Code Playgroud)

throw是一个声明:

ThrowStatement[Yield] :
    throw [no LineTerminator here] Expression[In, ?Yield] ;
Run Code Online (Sandbox Code Playgroud)

然后第一个ConciseBody主体语法将不起作用,因为AssignmentExpression不包含语句:

AssignmentExpression :
    YieldExpression
    ArrowFunction
    LeftHandSideExpression = AssignmentExpression
    LeftHandSideExpression AssignmentOperator AssignmentExpression
    BitwiseANDExpression : BitwiseANDExpression & EqualityExpression
    BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression
    BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression
Run Code Online (Sandbox Code Playgroud)

如果你使用大括号,那么ConciseBody的内部部分将是一个FunctionBody,它是一个语句列表.所以允许ThrowStatement.