箭头函数定义中是否需要带有默认参数值的括号

时间:2018-01-10 02:22:29

标签: javascript

var prev = a = new Date() => a; // Error

var prev = (a = new Date()) => a; // Good

在箭头函数中,当它只是一个参数时,我可以省略括号,但是当我这样做时,我必须添加它们。

这是语言架构中的错误,还是语言本身的结构?

3 个答案:

答案 0 :(得分:4)

在第一种情况下,您尝试声明2个变量:preva。您分配的值不正确。结果与您尝试直接在控制台中执行new Date() => a相同:

  

未捕获的SyntaxError:意外的令牌新

在第二种情况下,您只声明一个变量prev。该值是一个函数,其中一个参数a默认设置为new Date()

另见In JavaScript, is chained assignment okay?

答案 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()作为参数名称?错误!

它不够明确,所以编译器不喜欢它。如果你有默认值将它们包装在括号中。

详细了解MDN Default Params

答案 2 :(得分:0)

如果查看ecmascript spec for arrow function hasinitializer,您可以看到具有iniitializer的箭头函数的定义:

  

ArrowParameters:CoverParenthesizedExpressionAndArrowParameterList

并且CoverParenthesizedExpressionAndArrowParameterList的定义是:

  

CoverParenthesizedExpressionAndArrowParameterList [Yield]:   表达式[In,?Yield]   ()    ... BindingIdentifier [?Yield]   表达式[In,?Yield],... BindingIdentifier [?Yield]

你可以看到,当你有一个默认的初始值设定项时,箭头参数必须在()中,所以它是语言本身的结构