JavaScript在函数表达式前加上符号

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

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

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

91753 次浏览

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

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

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

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

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

从属于@TJCrowder的答案,+通常用于强制对值正如这个答案所解释的进行数值转换。在这种情况下,它被称为“一元加运算符”(为了便于谷歌搜索)。

var num = +variant;

因此,在函数前面,它可以是一种强制将函数结果解释为数字的方法。我怀疑它还没有发生,但理论上JIT可以使用它将函数编译为纯数字函数等。然而,为了防止一元加在更大的表达式中使用时是连接,你需要括号:

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

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

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

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

当然,在整个事情周围放括号也有这个目的。

太长别读(快速回答)

Plus Sign将继续操作数转换(转换)为数字,如果它还没有。

解决方案和起源

函数前的+符号,实际上称为一元加,是称为一元运算符的组的一部分,(一元加号)用于将字符串和其他表示形式转换为数字(整数或浮点数)。

一元操作是只有一个操作数的操作,即单个操作数这与二进制操作相反,二进制操作使用两个操作数

基本用途:

const x = "1";const y = "-1";const n = "7.77";
console.log(+x);// expected output: 1
console.log(+n);// expected output: 7.77
console.log(+y);// expected output: -1
console.log(+'');// expected output: 0
console.log(+true);// expected output: 1
console.log(+false);// expected output: 0
console.log(+'hello');// expected output: NaN

+符号位于变量、函数或任何返回的字符串表示之前时,输出将转换为整数或浮点数;一元操作符(+)也转换非字符串值truefalsenull

高级用途

使用您上面提到的功能的正确方法是:

+function(){return "3.141"}()// expected output: 3.141

我喜欢使用+new Date()对象转换为时间戳,如下所示:

+new Date()// expected output: 1641387991035

其他一元运算符

-一元否定运算符将其操作数转换为数字类型#36825;,并予以否定

~按位非运算符。

!逻辑非运算符。

delete删除运算符从对象中删除属性。

void无效运算符丢弃表达式的返回值。

typeof typeof运算符确定给定对象的类型。