我一直在寻找有关立即调用函数的信息,在某个地方我偶然发现了这个符号:
+function(){console.log("Something.")}()
有人可以向我解释一下函数前面的 +
符号的含义/作用吗?
它强制解析器将 +
之后的部分视为表达式。这通常用于立即调用的函数,例如:
+function() { console.log("Foo!"); }();
如果没有 +
,如果解析器处于等待语句(可以是表达式或多个非表达式语句)的状态,则单词 function
看起来像函数的开头 declaration< /em> 而不是函数 expression ,因此它后面的 ()
(上一行末尾的那些)将是语法错误(就像缺少名称一样,因为例子)。 使用 +
,它使它成为一个函数表达式,这意味着名称是可选的,并导致对该函数的引用,该函数可以被调用,因此括号是有效的。
+
只是选项之一。它也可以是 -
、!
、~
或几乎任何其他一元运算符。或者,您可以使用括号(这更常见,但在语法上既不正确也不正确):
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
作为@TJCrowder 答案的补充,+
通常用于强制对值 as this SO answer explains 进行数字转换。在这种情况下,它被称为“一元加运算符”(为了便于搜索)。
var num = +variant;
因此,在函数前面,它可以是一种强制将函数的结果解释为数字的方法。我怀疑它是否会发生,但理论上 JIT 可以使用它来将函数编译为仅限数字的函数等。但是,为了防止在更大的表达式中使用一元加号作为连接,您需要括号:
blah + (+(function(){ var scope; return "4"; })());
(+function() { ... })()
表示法永远无法在没有错误的情况下执行(除了它不能回答问题的事实)。
3++function...
不一样。
+function...
本身是不必要的。使用 blah + function( ){ ... }( );
可以得到相同的结果,这将不需要包装括号。
所以简短的回答是,它通过以一种或另一种方式使用函数结果来防止语法错误。
您还可以使用 void
运算符指示引擎您甚至对返回值不感兴趣:
void function() { console.log("Foo!"); }();
当然,在整个东西周围放置大括号也可以达到这个目的。
解决方案和起源
函数前面的 +
符号,实际上称为 Unary plus 并且是称为 Unary Operators 的组的一部分,并且(一元加号)用于将字符串和其他表示形式转换为数字(整数或浮点数)。
一元运算是只有一个操作数的运算,即单个输入。这与使用两个操作数的二元运算相反
基本用途:
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
我喜欢使用 +
将 new Date()
对象转换为 时间戳,如下所示:
+new Date()
// expected output: 1641387991035
其他一元运算符
一元否定运算符将其操作数转换为数字类型,然后将其取反。 ~ 按位 NOT 运算符。 !逻辑非运算符。 delete delete 操作符从对象中删除一个属性。 void void 运算符丢弃表达式的返回值。 typeof typeof 运算符确定给定对象的类型。