评估10和(10)

时间:2016-03-17 15:46:36

标签: javascript scope closures

在JavaScript中,评估(10)和10之间有什么区别?

如果我们在括号内放置一个匿名函数,我们可以像这样直接评估它:

(a => 10)() // returns 10

写作时会发生什么:

(10)

是否对括号进行了评估,然后对10进行评估,最后返回10?那么(10)我们有2个评估,10个,我们有1个评估?

3 个答案:

答案 0 :(得分:1)

如果查看spec,您会发现grouping operator

  

ParenthesizedExpression :(表达式)

     
      
  1. 返回评估 Expression 的结果。这可能是参考类型。
  2.         

    注意此算法不会将GetValue应用于评估 Expression 的结果。这样做的主要动机是,deletetypeof等运算符可以应用于带括号的表达式。

所以,它真正做的就是评估括号内的表达式。但是,正如明确指出的那样,它不会调用GetValue(例如,与AssignmentOperator不同)。

换句话说,如果您在表达式上下文中,expression(expression)是等效的。

  

因此,(10)我们有2个评估,10个,我们有1个评估?

答案 1 :(得分:0)

(a => 10)()

定义并立即评估函数。

(10)

是一个带有一些无关括号的(简单)表达式。

在实践中,前者是一种非常低效的方法,可以获得与后者(效率稍低)表达式相同的结果。

如果函数执行其他操作(例如,形成闭包或具有局部定义 - 在简单表达式中都不可能,则差异开始变得重要。

答案 2 :(得分:0)

代码(a => 10)定义了一个匿名函数。然后通过添加()之后,您可以评估该功能。但是,你的所有函数都返回值10.一个说明性的例子可能是使用代码(a => a + 1)(9),它返回10。

另一方面,代码(10)只是直接计算的代码(它不是函数定义)。您也可以写109 + 1以获得相同的效果。

(a => 10)()(10)之间的区别在于第一种形式允许您使用范围变量,从而用更少的代码表达更复杂的指令。