【发布时间】:2018-06-19 03:34:26
【问题描述】:
var prev = a = new Date() => a; // Error
var prev = (a = new Date()) => a; // Good
在箭头函数中,当它只是一个参数时,我可以省略括号,但是当我这样做时,我必须添加它们。
是语言架构的错误,还是语言本身的结构错误?
【问题讨论】:
标签: javascript
var prev = a = new Date() => a; // Error
var prev = (a = new Date()) => a; // Good
在箭头函数中,当它只是一个参数时,我可以省略括号,但是当我这样做时,我必须添加它们。
是语言架构的错误,还是语言本身的结构错误?
【问题讨论】:
标签: javascript
使用默认值时,箭头函数周围需要括号。
// 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() 作为参数名称?错误!它不够明确,所以编译器不喜欢它。如果您有默认值,请将它们括在括号中。
【讨论】:
如果您查看ecmascript spec for arrow function hasinitializer,您可以看到具有初始化器的箭头函数的定义:
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
而CoverParenthesizedExpressionAndArrowParameterList的定义是:
CoverParenthesizedExpressionAndArrowParameterList[Yield]: ( 表达式[In, ?Yield] ) ( ) ( ... BindingIdentifier[?Yield] ) ( 表达式[In, ?Yield] , ... BindingIdentifier[?Yield] )
可以看到,当你有默认初始化器时,箭头参数必须在(),所以它是语言本身的结构
【讨论】:
在第一种情况下,您尝试声明 2 个变量:prev 和 a。并且您分配的值不正确。结果和你尝试直接在控制台执行new Date() => a一样:
Uncaught SyntaxError: Unexpected token new
在第二种情况下,您只声明一个变量prev。该值是一个函数,其中一个参数a 默认设置为new Date()。
【讨论】: