Evaluating 10 and (10)
Evaluating 10 and (10)
在 JavaScript 中,求值 (10) 和 10 有什么区别?
如果我们把一个匿名函数放在括号里,我们可以直接像这样评估它:
(a => 10)() // returns 10
当我们写时会发生什么:
(10)
是否评估括号,然后评估 10,最后返回 10?所以对于 (10) 我们有 2 个评估,对于 10,我们有 1 个评估?
如果你看一下规范,你会发现关于分组运算符:
括号表达式 : ( 表达式 )
- 返回表达式的计算结果。这可能是"引用"类型。
注意:此算法不适用于
GetValue
计算表达式的结果。这样做的主要动机是将delete
和typeof
等运算符应用于括号表达式。
因此,它真正做的只是计算括号内的表达式。但是,如明确指出的,它不会调用GetValue
(例如,与赋值运算符不同)。
换句话说,如果您处于表达式上下文中,则expression
和(expression)
是等效的。
所以对于 (10) 我们有 2 个评估,对于 10,我们有 1 个评估?
是的。
(a => 10)()
定义并立即计算函数。
(10)
是一个带有一些无关括号的(简单)表达式。
在实践中,前者是一种非常低效的方法,可以获得与后者相同的结果(只是效率略低)。
如果函数做其他事情(例如,形成闭包或具有局部定义——这在简单表达式中都是不可能的,那么差异就变得很重要。
代码(a => 10)
定义匿名函数。然后通过添加()
,您可以评估该函数。但是,函数所做的只是返回值 10。一个说明性的例子可能是使用返回 10 的代码(a => a + 1)(9)
。
另一方面,代码(10)
只是直接计算的代码(它不是函数定义)。您也可以编写10
或9 + 1
以获得相同的效果。
(a => 10)()
和 (10)
之间的区别在于,第一种形式允许您使用作用域变量,从而用更少的代码表达更复杂的指令。
- Selenium WebDriver and JavaScript change
- PHP and Javascript functions
- Javascript Return and if/else
- SetTimeout and clearTimeout in Javascript
- lightbox in html 5 and javascript
- TimelineJS and AngularJS
- timeago.js with datatable and PHP
- javascript button ajax and php
- Ajax and Json with Rails
- Combine onload, onresize and onclick
- php布尔值's小写AND大写和数字布尔值'可以接受
- setTimeout and V8
- Jquery post and onclick
- Moment js and IOS
- Rails 3.2 and Paloma gem
- Backbone, TypeScript, and super
- iframe and JavaScript on different pages
- JSON and jQuery Search
- Flash and External Javascript
- Evaluating 10 and (10)