我一直在寻找关于自我调用函数的信息,在某个地方我偶然发现了这个符号:
+function(){}
有人可以向我解释函数前面的 + 符号是什么意思吗?
+
它强制解析器将 + 之后的部分视为表达式 . 这通常用于立即调用的函数,例如:
+function() { console.log("Foo!"); }();
如果没有 + ,如果解析器处于期望语句(可以是表达式或几个非表达式语句)的状态,则单词 function 看起来像是函数声明的开头而不是函数表达式,因此在它之后的 () (上面一行末尾的那些)将是语法错误(在该示例中,名称的缺失也是如此) . 使用 + ,它使它成为一个函数表达式,这意味着该名称是可选的,并且会导致对该函数的引用(可以调用),因此括号是有效的 .
function
()
+ 只是其中一个选项 . 它也可以是 - , ! , ~ ,或者几乎任何其他一元运算符 . 或者,您可以使用括号(这是更常见的,但在语法上也不是更多或更不正确):
-
!
~
(function() { console.log("Foo!"); })(); // or (function() { console.log("Foo!"); }());
@ TJCrowder答案的子公司 + 通常用于强制数值转换为as this SO answer explains . 在这种情况下,它被称为'unary plus operator'(为了便于谷歌搜索) .
var num = +variant;
因此,在函数前面,它可以强制将函数的结果解释为数字 . 我怀疑它是否发生了,但理论上JIT可以使用它来将函数编译为仅数值函数等 . 但是,为了防止一元加上在更大的表达式中使用时是串联,你需要括号:
blah + (+(function(){ var scope; return "4"; })());
所以简短的回答是它通过以某种方式使用函数结果来防止语法错误 .
您还可以使用 void 运算符指示您甚至不对返回值感兴趣的引擎:
void
void function() { console.log("Foo!"); }();
当然,在整个事物上放置括号也可以达到这个目的 .
3 回答
它强制解析器将
+
之后的部分视为表达式 . 这通常用于立即调用的函数,例如:如果没有
+
,如果解析器处于期望语句(可以是表达式或几个非表达式语句)的状态,则单词function
看起来像是函数声明的开头而不是函数表达式,因此在它之后的()
(上面一行末尾的那些)将是语法错误(在该示例中,名称的缺失也是如此) . 使用+
,它使它成为一个函数表达式,这意味着该名称是可选的,并且会导致对该函数的引用(可以调用),因此括号是有效的 .+
只是其中一个选项 . 它也可以是-
,!
,~
,或者几乎任何其他一元运算符 . 或者,您可以使用括号(这是更常见的,但在语法上也不是更多或更不正确):@ TJCrowder答案的子公司
+
通常用于强制数值转换为as this SO answer explains . 在这种情况下,它被称为'unary plus operator'(为了便于谷歌搜索) .因此,在函数前面,它可以强制将函数的结果解释为数字 . 我怀疑它是否发生了,但理论上JIT可以使用它来将函数编译为仅数值函数等 . 但是,为了防止一元加上在更大的表达式中使用时是串联,你需要括号:
所以简短的回答是它通过以某种方式使用函数结果来防止语法错误 .
您还可以使用
void
运算符指示您甚至不对返回值感兴趣的引擎:当然,在整个事物上放置括号也可以达到这个目的 .