JavaScript 函数表达式前的加号

IT技术 javascript function operators iife self-invoking-function
2021-01-18 17:59:33

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

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

有人可以向我解释+函数前面符号是什么意思/是什么意思吗?

3个回答

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

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

如果没有+那里,如果解析器处于期望语句(可以是表达式或多个非表达式语句)的状态,则该词function看起来像函数声明的开头而不是函数表达式,因此它()后面的(上面一行末尾的那些)将是一个语法错误(在那个例子中,名称的缺失也是如此)。+,它使一个函数表达,这意味着该名称是可选的,并且结果的功能,其可以被调用的参考,因此,括号是有效的。

+只是其中一种选择。它也可以是-!~或几乎任何其他一元运算符。或者,您可以使用括号(这更常见,但在语法上既不正确也不正确):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
更多详细信息在这里,benalman.com/news/2010/11/...
2021-03-13 17:59:33
注意:在两个括号选项中,jsLint更喜欢第二个。我认为jsHint不那么挑剔。
2021-03-13 17:59:33
我们不能说paren-wrapping 是一种高级符号吗?我非常熟悉用于包含表达式的括号。如果您还不知道 js 的这个神秘怪癖,那么在这种情况下 + 正在做什么根本不清楚。
2021-03-15 17:59:33
使用“加”符号的常用库之一是Bootstrap(这是我最终阅读此线程的方式)。
2021-03-24 17:59:33
Bootstrap 正在这样做,顺便说一句:maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
2021-03-24 17:59:33

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

var num = +variant;

因此,在函数之前,它可以是一种强制将函数的结果解释为数字的方法。我怀疑它是否会发生,但理论上 JIT 可以使用它来将函数编译为仅数字函数等。但是,为了防止在更大的表达式中使用一元加号时进行连接,您需要括号:

blah + (+(function(){ var scope; return "4"; })());
虽然经过进一步思考,这+function...本身是不必要的。可以得到相同的结果,blah + function( ){ ... }( );这将否定包装括号的需要。
2021-03-10 17:59:33
好吧,我可能一直在吹毛求疵。
2021-03-16 17:59:33
这是如何获得 37 票的?(+function() { ... })()符号永远没有错误(从事实上除了这不回答这个问题)执行。
2021-03-23 17:59:33
@Christoph 我倾向于将这些括号留在那里。事实上,如果它们丢失了,我什至会添加它们。它使正在发生的事情变得更加清楚,并且还可以防止通过删除空格来最小化代码时出现问题,从而导致3++function...不一样。
2021-03-28 17:59:33
@whitequark:在函数+调用周围错过了一对大括号。怀疑投票更多是因为数字铸造解释。
2021-04-02 17:59:33

所以简短的回答是,它通过以一种或另一种方式使用函数结果来防止语法错误。

您还可以使用void运算符指示引擎您甚至对返回值不感兴趣

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

当然,在整个事物周围放置大括号也可以达到这个目的。

一个好点。似乎使用其中一个运营商会违背目前的行业标准。也许“酷孩子”开发人员会选择它,否则我仍然没有看到使用某些东西而不是 void 或 ()
2021-03-30 17:59:33
空或括号是非常可取的。它们不含 WTF。使用 + 是一种不太聪明的聪明。
2021-04-03 17:59:33