在JavaScript中,评估(10)和10之间有什么区别?
如果我们在括号内放置一个匿名函数,我们可以像这样直接评估它:
(a => 10)() // returns 10
写作时会发生什么:
(10)
是否对括号进行了评估,然后对10进行评估,最后返回10?那么(10)我们有2个评估,10个,我们有1个评估?
答案 0 :(得分:1)
如果查看spec,您会发现grouping operator:
ParenthesizedExpression :(表达式)
- 返回评估 Expression 的结果。这可能是参考类型。
醇>注意此算法不会将
GetValue
应用于评估 Expression 的结果。这样做的主要动机是,delete
和typeof
等运算符可以应用于带括号的表达式。
所以,它真正做的就是评估括号内的表达式。但是,正如明确指出的那样,它不会调用GetValue
(例如,与AssignmentOperator不同)。
换句话说,如果您在表达式上下文中,expression
和(expression)
是等效的。
因此,(10)我们有2个评估,10个,我们有1个评估?
是
答案 1 :(得分:0)
(a => 10)()
定义并立即评估函数。
(10)
是一个带有一些无关括号的(简单)表达式。
在实践中,前者是一种非常低效的方法,可以获得与后者(效率稍低)表达式相同的结果。
如果函数执行其他操作(例如,形成闭包或具有局部定义 - 在简单表达式中都不可能,则差异开始变得重要。
答案 2 :(得分:0)
代码(a => 10)
定义了一个匿名函数。然后通过添加()
之后,您可以评估该功能。但是,你的所有函数都返回值10.一个说明性的例子可能是使用代码(a => a + 1)(9)
,它返回10。
另一方面,代码(10)
只是直接计算的代码(它不是函数定义)。您也可以写10
或9 + 1
以获得相同的效果。
(a => 10)()
和(10)
之间的区别在于第一种形式允许您使用范围变量,从而用更少的代码表达更复杂的指令。