【问题标题】:Evaluating 10 and (10)评估 10 和 (10)
【发布时间】:2016-03-17 15:46:36
【问题描述】:

在 JavaScript 中,求值 (10) 和 10 有什么区别?

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

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

当我们写作时会发生什么:

(10)

是先计算括号,然后计算 10,最后返回 10?那么对于 (10) 我们有 2 个评估,对于 10,我们有 1 个评估?

【问题讨论】:

  • 第一个是返回 10 的 IIFE。第二个不返回任何东西,它是一个括号中的值。
  • 我不得不用谷歌搜索 IIFE :)
  • ( ) - 分组运算符,控制表达式中计算的优先级。

标签: javascript scope closures


【解决方案1】:

如果你查看spec,你会发现关于grouping operator

ParenthesizedExpression:(表达式)

  1. 返回计算表达式的结果。这可能是引用类型。

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

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

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

那么对于 (10),我们有 2 个评估,对于 10,我们有 1 个评估?

是的。

【讨论】:

  • 我认为无法客观地衡量“评估”的数量。
  • @Bergi:好吧,理论上它涉及更多步骤。是否实现是另一回事。
【解决方案2】:
(a => 10)()

定义并立即评估一个函数。

(10)

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

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

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

【讨论】:

    【解决方案3】:

    代码(a => 10) 定义了一个匿名函数。然后通过在后面添加() 来评估该函数。但是,您的函数所做的只是返回值 10。一个说明性示例可能是使用代码 (a => a + 1)(9),它返回 10。

    另一方面,代码(10) 只是直接计算的代码(它不是函数定义)。你也可以写109 + 1 来达到同样的效果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多