var prev = a = new Date() => a; // Error
var prev = (a = new Date()) => a; // Good
在箭头函数中,当它只是一个参数时,我可以省略括号,但是当我这样做时,我必须添加它们。
这是语言架构中的错误,还是语言本身的结构?
答案 0 :(得分:4)
在第一种情况下,您尝试声明2个变量:prev
和a
。您分配的值不正确。结果与您尝试直接在控制台中执行new Date() => a
相同:
未捕获的SyntaxError:意外的令牌新
在第二种情况下,您只声明一个变量prev
。该值是一个函数,其中一个参数a
默认设置为new Date()
。
答案 1 :(得分:2)
使用默认值时,箭头函数周围需要括号 。
// Correct approach for default values
var prev = (a = new Date()) => a;
// Incorrect approach
var prev = a = new Date() => a; // Nope. Where does the arrow function start?
var prev = a = (new Date()) => a; // Invalid parameter name right?
为什么?
因为编译器认为你在var prev = a = new Date() => a;
询问:
prev
等于值a
,其等于arrow function
的值new Date()
作为参数名称?错误!它不够明确,所以编译器不喜欢它。如果你有默认值将它们包装在括号中。
答案 2 :(得分:0)
如果查看ecmascript spec for arrow function hasinitializer,您可以看到具有iniitializer的箭头函数的定义:
ArrowParameters:CoverParenthesizedExpressionAndArrowParameterList
并且CoverParenthesizedExpressionAndArrowParameterList
的定义是:
CoverParenthesizedExpressionAndArrowParameterList [Yield]: (表达式[In,?Yield] ) () ( ... BindingIdentifier [?Yield] ) (表达式[In,?Yield],... BindingIdentifier [?Yield] )
你可以看到,当你有一个默认的初始值设定项时,箭头参数必须在()
中,所以它是语言本身的结构