我一直在寻找有关立即调用函数的信息,并且在某处偶然发现了这个符号:
+function(){console.log("Something.")}()
有人可以向我解释+
函数前面的符号是什么意思/是什么意思吗?
我一直在寻找有关立即调用函数的信息,并且在某处偶然发现了这个符号:
+function(){console.log("Something.")}()
有人可以向我解释+
函数前面的符号是什么意思/是什么意思吗?
它强制解析器将 后面的部分+
视为表达式。这通常用于立即调用的函数,例如:
+function() { console.log("Foo!"); }();
如果没有+
那里,如果解析器处于期望语句(可以是表达式或多个非表达式语句)的状态,则该词function
看起来像函数声明的开头而不是函数表达式,因此它()
后面的(上面一行末尾的那些)将是一个语法错误(在那个例子中,名称的缺失也是如此)。用的+
,它使一个函数表达,这意味着该名称是可选的,并且结果的功能,其可以被调用的参考,因此,括号是有效的。
+
只是其中一种选择。它也可以是-
、!
、~
或几乎任何其他一元运算符。或者,您可以使用括号(这更常见,但在语法上既不正确也不正确):
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
@TJCrowder's answer的附属,+
通常用于强制数值转换,如this SO answer所解释的那样。在这种情况下,它被称为“一元加运算符”(为了便于谷歌搜索)。
var num = +variant;
因此,在函数之前,它可以是一种强制将函数的结果解释为数字的方法。我怀疑它是否会发生,但理论上 JIT 可以使用它来将函数编译为仅数字函数等。但是,为了防止在更大的表达式中使用一元加号时进行连接,您需要括号:
blah + (+(function(){ var scope; return "4"; })());
所以简短的回答是,它通过以一种或另一种方式使用函数结果来防止语法错误。
您还可以使用void
运算符指示引擎您甚至对返回值不感兴趣:
void function() { console.log("Foo!"); }();
当然,在整个事物周围放置大括号也可以达到这个目的。