箭头函数定义中使用默认参数值时需要加括号吗?

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

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

在箭头函数中,当只有一个参数时,我可以省略括号,但是这样做时必须添加它们。
这是语言架构的错误还是语言本身结构的问题?
3个回答

4

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

Uncaught SyntaxError: Unexpected token new

在第二种情况下,你只声明一个变量prev。这个值是一个带有一个参数a的函数,默认设置为new Date()

另请参见在JavaScript中,链式赋值可以吗?


3

在使用默认值时,箭头函数需要括号。

// 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的值,而a的值是一个带有参数名为new Date()的箭头函数。出错了!

这种写法不够明确,所以编译器不喜欢它。如果你有默认值,请将其括在括号里。

详细内容请参见MDN 默认参数


0

如果你查看箭头函数的ECMAScript规范有初始化器, 你可以看到一个带有初始化器的箭头函数的定义:

ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList

CoverParenthesizedExpressionAndArrowParameterList的定义如下:

CoverParenthesizedExpressionAndArrowParameterList[Yield] : ( Expression[In, ?Yield] ) ( ) ( ... BindingIdentifier[?Yield] ) ( Expression[In, ?Yield] , ... BindingIdentifier[?Yield] )

你可以看到,当你有一个默认的初始化器时,箭头参数必须在()中,因此它是语言本身的结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接