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

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

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


当前回答

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

var num = +variant;

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

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

其他回答

TL;DR(快速回答)

加号强制转换(转换)继续操作数为一个数字(如果还没有)。

解决方案及来源

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

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

基本用途:

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

当+号位于变量、函数或任何返回的字符串表示之前时,输出将被转换为整数或浮点数;一元运算符(+)也转换非字符串值true、false和null。

先进的使用

使用上述函数的正确方法是:

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

我喜欢使用+来将一个新的Date()对象转换为时间戳,就像这样:

+new Date()
// expected output: 1641387991035

其他一元运算符

-一元否定运算符将其操作数转换为Number类型 然后求负数。 ~位NOT运算符。 ! 逻辑NOT运算符。 delete操作符从对象中删除一个属性。 void操作符丢弃表达式的返回值。 typeof操作符确定给定对象的类型。

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

你也可以通过使用void操作符告诉引擎你对返回值不感兴趣:

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

当然,在整个东西周围加上大括号也可以达到这个目的。

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

var num = +variant;

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

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

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

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

Without the + there, if the parser is in a state where it's expecting a statement (which can be an expression or several non-expression statements), the word function looks like the beginning of a function declaration rather than a function expression and so the () following it (the ones at the end of the line above) would be a syntax error (as would the absense of a name, in that example). With the +, it makes it a function expression, which means the name is optional and which results in a reference to the function, which can be invoked, so the parentheses are valid.

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

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