我一直在寻找有关立即调用的函数的信息,在某处我偶然发现了这个表示法:
+function(){console.log("Something.")}()
有人能给我解释一下函数前面的+
符号是什么意思/做什么?
它强制解析器将+
后面的部分视为表达式。这通常用于立即调用的函数,例如:
+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!"); }();
当然,在整件事周围放上牙套也能达到这个目的。