我一直在寻找有关立即调用函数的信息,然后在某个地方看到了这种符号:
+function(){console.log("Something.")}()
有人能解释一下函数前面的+
符号是什么意思/作用吗?
我一直在寻找有关立即调用函数的信息,然后在某个地方看到了这种符号:
+function(){console.log("Something.")}()
有人能解释一下函数前面的+
符号是什么意思/作用吗?
它强制解析器将+
后面的部分视为表达式。这通常用于立即调用的函数,例如:
+function() { console.log("Foo!"); }();
没有 +
,如果解析器处于期望语句的状态(它可以是表达式或多个非表达式语句),单词 function
看起来像一个函数声明的开始,而不是函数表达式,因此后面的 ()
(如上行的括号)将是语法错误(在该示例中也应有名称)。使用 +
,它使其成为函数表达式,这意味着名称是可选的,并且结果是对函数的引用,可以调用,因此括号是有效的。
+
只是其中一种选项。它也可以是 -
,!
,~
或几乎任何其他一元运算符。或者,您可以使用括号(这更常见,但从语法上来说既不更正确也不更不正确):
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
+
通常用于强制将值转换为数字 正如这个 Stack Overflow 回答所解释的那样。在这种情况下,它被称为“一元加运算符”(方便搜索)。var num = +variant;
因此,在函数前面使用它可以强制将函数的结果解释为数字。我怀疑这种情况还没有发生,但从理论上讲,JIT可以使用它将函数编译为仅限数字的函数等。然而,为了防止一元加号在较大表达式中用作连接符,您需要使用括号:
blah + (+(function(){ var scope; return "4"; })());
(+function() { ... })()
иҝҷз§ҚеҶҷжі•жҖ»жҳҜдјҡеҮәй”ҷзҡ„пјҲйҷӨдәҶиҝҷдёӘдёҚеӣһзӯ”й—®йўҳпјүгҖӮ - whitequark3 + +function(){ return "4"; }();
- Christoph3++function...
不同。 - Benjam+function...
本身是不必要的。使用blah + function( ){ ... }( );
可以得到相同的结果,这将消除需要添加括号的需要。 - Benjam那么简短的回答是,通过以某种方式使用函数结果,它可以防止语法错误。
您还可以使用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
+function(){return "3.141"}()
// expected output: 3.141
我喜欢使用+
将一个new Date()
对象转换为时间戳,就像这样:
+new Date()
// expected output: 1641387991035
-
一元负号运算符将其操作数转换为数字类型,然后取反。
~
按位非运算符。
!
逻辑非运算符。
delete
delete运算符从一个对象中删除一个属性。
void
void运算符丢弃表达式的返回值。
typeof
typeof运算符确定给定对象的类型。
+
的 副作用 是将其参数强制转换为数字。在我看来,这相当令人反感,特别是考虑到二元运算符 +
也执行字符串连接。所以 'hello' + 'world'
变成了 'helloworld'
,但 +'hello'
变成了 NaN
,而不是与空字符串连接的结果 'hello'
。 - Peter Bašista