Evaluating 10 and (10)

Evaluating 10 and (10)

本文关键字:and Evaluating      更新时间:2023-09-26

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

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

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

当我们写时会发生什么:

(10)

是否评估括号,然后评估 10,最后返回 10?所以对于 (10) 我们有 2 个评估,对于 10,我们有 1 个评估?

如果你看一下规范,你会发现关于分组运算符:

括号表达式 : ( 表达式 )

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

注意:此算法不适用于GetValue计算表达式的结果。这样做的主要动机是将 deletetypeof 等运算符应用于括号表达式。

因此,它真正做的只是计算括号内的表达式。但是,如明确指出的,它不会调用GetValue(例如,与赋值运算符不同)。

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

所以对于 (10) 我们有 2 个评估,对于 10,我们有 1 个评估?

是的。

(a => 10)()

定义并立即计算函数。

(10)

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

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

如果函数做其他事情(例如,形成闭包或具有局部定义——这在简单表达式中都是不可能的,那么差异就变得很重要。

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

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

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