JavaScript加号在功能名称前面

jOp*_*cic 840 javascript function operators iif iife

我一直在寻找关于自我调用函数的信息,在某个地方我偶然发现了这个符号:

+function(){}
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下+这个功能前面的符号意味着什么?

T.J*_*der 1301

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

+function() { console.log("Foo!"); }();
Run Code Online (Sandbox Code Playgroud)

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

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

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
Run Code Online (Sandbox Code Playgroud)

  • 难道我们不能说paren-wrapping是一种优越的符号吗?我非常熟悉用于包含表达的parens.如果你还不知道js这个神秘的怪癖,那么在这种情况下+正在做什么并不清楚. (155认同)
  • 很棒的答案!我不知道你可以在函数前面使用`-`,`!`,`~` - 这个答案是我的最爱! (69认同)
  • 使用"加号"表示法的常用库之一是[Bootstrap](http://getbootstrap.com/)(这是我最终阅读这个帖子的方式). (42认同)
  • @Chris:你说得好点.我总是使用parens,我觉得它们更舒服.其他选择感觉不知何故......误导.但是,当我在上面说"正确"时,我的意思是*语法*,而不是更广泛的意义.也许我会说得更清楚,虽然我不想过度炒蛋.让我想一想. (17认同)
  • 这里有更详细的说明,http://benalman.com/news/2010/11/immediately-invoked-function-expression/ (12认同)
  • @EddieB:这不是运算符重载,它只是使用运算符.:-)(JavaScript确实让你*非常轻微*通过`valueOf`和`toString`插入类型转换,这可能与操作符的行为有关,但这是另一回事......) (2认同)

Phi*_*l H 92

@TJCrowder的答案的子公司+通常用于强制数值转换值,因为这个SO答案解释.在这种情况下,它被称为'一元加运算符'(为了便于谷歌搜索).

var num = +variant;
Run Code Online (Sandbox Code Playgroud)

因此,在函数前面,它可以强制将函数的结果解释为数字.我怀疑它还没有发生,但理论上JIT可以使用它来编译函数作为一个仅限数字的函数等.但是,为了防止一元加上在一个更大的表达式中使用时是串联,你需要括号:

blah + (+(function(){ var scope; return "4"; })());
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我可能一直在挑剔. (10认同)
  • @whitequark:错过了函数+调用周围的一对大括号.由于数字铸造的解释,怀疑投票更多. (6认同)
  • 这怎么会得到37票?`(+ function(){...})()符号永远不会没有错误地执行(除了这个问题没有回答这个问题). (3认同)
  • @Christoph我倾向于把那些括号留在那里.事实上,如果他们失踪,我会尽可能地添加它们.它使得更清楚的是发生了什么,并且还通过删除空格来防止代码被最小化时出现问题,从而导致`3 ++ function ...`这是不一样的. (2认同)
  • 虽然进一步反思,"+函数......"本身是不必要的.使用`blah + function(){...}();`可以得到相同的结果,这将取消对包装括号的需要. (2认同)

Ja͢*_*͢ck 57

所以简短的回答是它通过以某种方式使用函数结果来防止语法错误.

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

void function() { console.log("Foo!"); }();
Run Code Online (Sandbox Code Playgroud)

当然,在整个事物上放置括号也可以达到这个目的.

  • 无效或括号是*非常优选的.他们没有WTF.使用+是一种不聪明的聪明. (42认同)
  • 好点.似乎使用其中一个运营商会违背目前的行业标准.也许"酷孩子"开发者会选择它,否则我仍然没有看到使用某些东西而不是虚空或() (2认同)