函数表达式前面的JavaScript加号


866

我一直在寻找有关立即调用的函数的信息,在某个地方我偶然发现了这种表示法:

+function(){console.log("Something.")}()

有人可以向我解释+该功能前面的符号的含义/含义吗?


17
本·阿尔曼(Ben Alman)在这里进行了全部解释:mths.be/iife
Mathias Bynens 2012年

Answers:


1320

它强制解析器将后面的部分+视为表达式。通常用于立即调用的函数,例如:

+function() { console.log("Foo!"); }();

如果没有+解析器,则该解析器处于期望语句的状态(可以是一个表达式或几个非表达式语句),该单词function看起来像是函数声明的开头,而不是函数表达式的开头,因此()紧随其后(上面一行的末尾)是语法错误(在该示例中,缺少名称也是如此)。+,它使一个函数表达,这意味着该名称是可选的,并且结果的功能,其可以被调用的参考,因此,括号是有效的。

+只是选项之一。它也可以是-!~,或几乎任何其他一元运算符。或者,您可以使用括号(这是更常见的,但是在语法上既不正确,也不正确):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());


159
我们不能说paren-wrapping是一种高级符号吗?我非常熟悉包含表达式的括号。如果您还不知道js的这种怪异的怪癖,那么在这种情况下+到底在做什么并不十分清楚。
克里斯

1
注意:在这两个parens选项中,jsLint更喜欢第二个。我认为jsHint不太麻烦
甜菜根-甜菜根

43
Bootstrap是使用“ plus”符号的常用库之一(这是我最终阅读此线程的方式)。
2014年

引导程序正在这样做,顺便说一句:maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
xanderiel 2014年

94

@TJCrowder的答案+的子级通常用于强制数值强制转换,如该SO答案所说明。在这种情况下,它称为“一元加号运算符”(为便于谷歌搜索)。

var num = +variant;

因此,在函数前面可以采用一种方法来强制将函数的结果解释为数字。我怀疑它是否会发生,但是从理论上讲,JIT可以使用它来将函数编译为仅数字函数等。但是,为了防止一元加号在较大的表达式中使用时被串联,您需要使用括号:

blah + (+(function(){ var scope; return "4"; })());

3
如何获得37票赞成票?这种(+function() { ... })()表示法永远不会没有错误地执行(除了不能回答问题这一事实之外)。
whitequark 2012年

6
@whitequark:在函数+调用周围缺少一对花括号。怀疑投票更多是由于数字转换的解释。
Phil H

10
好吧,我可能一直在挑剔。
whitequark 2012年

2
@Christoph我倾向于将那些括号留在那里。实际上,如果它们不见了,我甚至会添加它们。这样可以更清楚地了解发生了什么,并且还可以通过删除空格来最大程度地减少代码,从而避免出现问题,从而避免出现问题3++function...
杰姆

3
尽管再三考虑,但+function...它本身是不必要的。可以得到相同的结果,blah + function( ){ ... }( );从而不需要包装支架。
杰姆

60

因此简短的答案是,通过以一种或另一种方式使用函数结果,可以防止语法错误。

您还可以使用void运算符来指示引擎您甚至对返回值都不感兴趣:

void function() { console.log("Foo!"); }();

当然,将括号放在整个对象上也可以达到此目的。


45
空隙或括号是非常优选的。它们不包含WTF。使用+并不是很聪明。
Peter Wone

2
好点。似乎使用其中一家运营商将违反目前的行业标准。也许“酷小子”开发人员会选择它,否则我仍然看不到使用某种东西而不是void或()的意义
dudewad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.