JavaScript plus sign in front of function name
我一直在寻找有关自调用函数的信息,在某个地方我偶然发现了这个符号:
有人能给我解释一下函数前面的+符号是什么意思吗?
- 本·阿尔曼在这里解释了这一切:mths.be/iife
- 相关:感叹号在函数之前做什么?
它强制解析器将+后面的部分视为表达式。这通常用于立即调用的函数,例如:
1
| +function() { console.log("Foo!"); }(); |
如果没有+,如果解析器处于期望语句(可以是表达式或多个非表达式语句)的状态,那么单词function看起来像是函数声明的开头,而不是函数表达式,因此后面的()(上面一行末尾的那些)将不需要这将是一个语法错误(在这个例子中,名称的缺失也是如此)。对于+,它使其成为一个函数表达式,这意味着名称是可选的,并且会导致对函数的引用,可以调用函数,因此括号是有效的。
+只是其中一个选项。它也可以是-、!、~或任何其他一元运算符。或者,您可以使用括号(这是更常见的,但在语法上也不正确):
1 2 3
| (function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }()); |
- 伟大的回答!我不知道你可以在函数前面使用-,!,~--这个答案是我最喜欢的!
- 这里有更详细的介绍,benalman.com/news/2010/11/…
- 难道我们不能说帕伦包装是一个更好的符号吗?我很熟悉帕伦斯的表达方式。如果你还不知道JS的神秘怪癖,那么现在还不清楚+在这种情况下会做什么。
- @克里斯:你说得对。我总是用帕伦斯,我只是觉得他们更舒服。其他的选择有点……误导。但当我在上面说"正确"时,我的意思是从句法上,而不是更广泛的意义上。也许我会更清楚一点,尽管我不想把布丁煮过头。让我想想。
- @克里斯:最后,我觉得有针对性的改变不会过分刺激。
- @克里斯,那要看…根据您使用的符号,您会得到不同的返回值。可能需要将返回值(例如否定或解析为int)转换为int,因此您当然可以使用!或+,而不是(...)。
- @T.J.Crowder可以用它代替匿名功能吗?
- 注意:在这两个parens选项中,jslint更喜欢第二个选项。我认为jshint不那么挑剔。
- parens语法在最新版本的chrome&safari中的执行速度也快于一元运算符或void。
- 使用"加号"符号的一个常用库是bootstrap(这就是我最终如何阅读这个线程)。
- 引导程序正在这样做,btw:maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
- 我没有意识到JS允许操作符重载(本质上)~有趣。
- @埃迪:这不是运算符重载,它只是在使用运算符。:-)(javascript允许您通过valueOf和toString稍微插入到类型转换中,这与操作员的行为有关,但这是另一回事…)
- 雅…我只是在复习你对这个问题的回答~:)我的术语不正确…非常有趣的是,如何用一元运算符修改声明…相当酷……它也适用于其他操作员吗?位移位等)
- @T.J.Crowder刚用tilde和minus试过这个,它也能用~function() {console.log("Foo!"); } ();:)
- 艾迪:是的。:-)"+只是其中一个选项。它也可以是-、!、~或任何其他一元运算符。"
- 但当我在上面说"正确"时,我的意思是从句法上,而不是更广泛的意义上。正如甜菜根所指出的那样,在狭义上更广泛的jslint意义上,parens实际上是纠正剂。^)
- 如果绑定多个脚本文件,加号选项是否会导致问题?你最终可能会和(some js expression) +function(a){}一起。
- @xr280xr:实际上,他们中的一些人有这个问题。()版本可以与某些内容组合,使前面的内容成为函数调用。如果您使用的脚本合并器不适合您,那么启动要与;组合的脚本以防止出现这种情况。
作为@tjcrowder答案的附属,+通常用于强制数值转换,正如答案所解释的那样。在这种情况下,它被称为"一元加运算符"(为了便于搜索)。
所以在函数前面,它可以是一种强制将函数的结果解释为数字的方法。我怀疑这种情况是否会发生,但理论上,JIT可以使用这种方法将函数编译为仅限数字的函数等。但是,为了防止在较大的表达式中使用一元加号作为连接,您需要括号:
1
| blah + (+(function(){ var scope; return"4"; })()); |
- 这是怎么得到37票的?(+function() { ... })()表示法永远不能没有错误地执行(除了这不能回答问题)。
- @WhiteQuark:在函数+调用周围缺少一对大括号。怀疑上票更多是因为数字决定的解释。
- 好吧,我可能一直在吹毛求疵。
- 你有一些不必要的括号,这样做就完全足够了:3 + +function(){ return"4"; }();。
- @克里斯托夫,我倾向于把那些括号留在那里。事实上,如果他们不见了,我会尽可能地加上他们。这使得它更清楚地说明了正在发生的事情,并且在通过删除空格来最小化代码时也可以防止出现问题,从而导致3++function...,这是不一样的。
- 尽管进一步考虑,+function...本身是不必要的。使用blah + function( ){ ... }( );也可以得到相同的结果,这将消除对包装支架的需求。
因此,简短的答案是,通过以某种方式使用函数结果,它可以防止语法错误。
您还可以使用void运算符指示引擎您甚至对返回值不感兴趣:
1
| void function() { console.log("Foo!"); }(); |
当然,在整件事情上加上支架也有这个目的。
- 空位或括号是非常可取的。它们是免费的。使用+是一种不太聪明的聪明方法。
- 好点。似乎使用其中一个运营商会违反目前的行业标准。也许"酷小子"开发者会选择它,否则我仍然没有看到使用某个东西的意义,而不是空虚或()。
- 缩小后文件大小会减小吗?