提问者:小点点

函数表达式前面的JavaScript加号


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

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

有人能给我解释一下函数前面的+符号是什么意思/做什么?


共3个答案

匿名用户

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

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

如果没有+,如果解析器处于期望语句(可以是一个表达式或几个非表达式语句)的状态,那么单词function看起来像是函数声明的开头,而不是函数表达式的开头,因此它后面的()(上面行末尾的那些)将是语法错误(在该示例中,名称的无意义也是如此)。使用+,它使其成为一个函数表达式,这意味着名称是可选的,并导致对函数的引用,该函数可以被调用,因此括号是有效的。

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

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

匿名用户

作为@TJCrowder答案的补充,+通常用于强制数值强制转换,正如SO答案所解释的那样。在这个例子中,它被称为“一元加运算符”(为了便于谷歌搜索)。

var num = +variant;

因此,在函数前面,它可以是一种强制将函数的结果解释为数字的方法。我怀疑这种情况还没有发生,但理论上JIT可以使用它来将函数编译为只包含数值的函数等。然而,为了防止一元加在较大的表达式中使用时成为一个串联,您将需要括号:

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

匿名用户

因此,简单的答案是,它通过以某种方式使用函数结果来防止语法错误。

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

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

当然,在整件事周围放上牙套也能达到这个目的。