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

时间:2016-04-02 17:43:39

标签: 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。

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

1 个答案:

答案 0 :(得分:8)

Arrow functions的定义如下:

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

ConciseBody[In] :
    [lookahead ≠ { ] AssignmentExpression[?In]
    { FunctionBody }

throw是一个声明:

ThrowStatement[Yield] :
    throw [no LineTerminator here] Expression[In, ?Yield] ;

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

AssignmentExpression :
    YieldExpression
    ArrowFunction
    LeftHandSideExpression = AssignmentExpression
    LeftHandSideExpression AssignmentOperator AssignmentExpression
    BitwiseANDExpression : BitwiseANDExpression & EqualityExpression
    BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression
    BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression

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