我一直在寻找关于立即调用函数的信息,在某个地方我偶然发现了这个符号:
+function(){console.log("Something.")}()
谁能给我解释一下函数前面的+号是什么意思?
我一直在寻找关于立即调用函数的信息,在某个地方我偶然发现了这个符号:
+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!"); }());