【问题标题】:Why we have to wrap throw with brackets in es6 arrow functions [duplicate]为什么我们必须在 es6 箭头函数中用括号括起来 [重复]
【发布时间】:2016-04-02 17:43:38
【问题描述】:

我想问问有没有人知道原因

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

const fun = msg => { throw new Error( msg ); } 有效

自从

const fun = msg => new Error( t ); 有效

有人(我会)希望throw 的情况也是有效的 JS。

这个选择背后有什么原因吗?例如会不会让口译员感到困难?

【问题讨论】:

  • 因为它相当于function(msg) { return throw new Error(msg); }
  • 是的,你不能returnthrow

标签: javascript ecmascript-6


【解决方案1】:

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 是允许的。

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 2017-11-05
    • 2017-04-26
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2011-08-14
    • 2017-05-22
    相关资源
    最近更新 更多