【问题标题】:Are parentheses required in an arrow function definition with default argument values具有默认参数值的箭头函数定义中是否需要括号
【发布时间】:2018-06-19 03:34:26
【问题描述】:
var prev = a = new Date() => a; // Error

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

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

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    // 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】:

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

      ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList

      而CoverParenthesizedExpressionAndArrowParameterList的定义是:

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

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

      【讨论】:

        【解决方案3】:

        在第一种情况下,您尝试声明 2 个变量:prev 和 a。并且您分配的值不正确。结果和你尝试直接在控制台执行new Date() => a一样:

        Uncaught SyntaxError: Unexpected token new

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

        另见In JavaScript, is chained assignment okay?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 2016-05-28
          • 1970-01-01
          • 2011-08-26
          • 2019-06-15
          • 1970-01-01
          相关资源
          最近更新 更多