我想问一下有人知道原因
const fun = msg => throw new Error( msg );
无效的JS
const fun = msg => { throw new Error( msg ); }
有效
由于
const fun = msg => new Error( t );
有效
有人(我会)也希望throw
的情况是有效的JS。
这个选择背后有什么理由吗?例如是否会使翻译或其他事情变得困难?
答案 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 。