JavaScript的function领先砰! 句法

我现在已经在几个图书馆看到了这个语法,我想知道它的好处是什么。 (注意我很了解闭包和代码在做什么,我只关心语法上的差异)

!function(){ // do stuff }(); 

作为更常见的替代scheme

 (function(){ // do stuff })(); 

用于自我调用匿名函数。

我想知道一些事情。 首先,什么是允许顶部的例子实际工作? 为了使这个语句在句法上是正确的,为什么是必要的? 我也被告知, +工作,我敢肯定其他人,取代!

其次,有什么好处? 我只能说,它保存了一个字符,但我无法想象吸引众多使用者的巨大好处。 我还有其他一些好处吗?

我能看到的唯一的另一个区别是自调函数的返回值,但在这两个例子中,我们并不关心函数的返回值,因为它只用于创build闭包。 那么有人可以告诉我为什么可以使用第一个语法?

理想情况下,你应该能够做到这一切只是因为:

 function(){ // do stuff }(); 

这意味着声明匿名函数并执行它。 但是由于JS语法的细节,这是行不通的。

所以实现这个最短的forms是使用一些expression式,例如UnaryExpression(以及CallExpression):

 !function(){ // do stuff }(); 

或者为了好玩:

 -function(){ // do stuff }(); 

要么:

 +function(){ // do stuff }(); 

甚至:

 ~function(){ // do stuff return 0; }( ); 

在JavaScript中,以function开头的行应该是一个函数声明 ,应该看起来像

 function doSomething() { } 

一个自我调用的function

 function(){ // do stuff }(); 

不适合这种forms(并会导致在第一个开放paren语法错误,因为没有函数名称),所以括号是用来描绘一个匿名函数expression式

 (function(){ // do stuff })(); 

但是任何创build一个expression式(而不是函数声明)的东西都会这样做,所以就这样! 。 这是告诉解释者,这不是一个函数声明。 除此之外,运算符优先级规定函数在否定之前被调用。

我不知道这个惯例,但是如果它变得普遍,它可能有助于可读性。 我的意思是说,任何人在一大块代码顶部读取!function都会期望一个自我调用,当我们看到(function时候,我们已经习惯了相同的方式,除了我们将失去那些恼人的括号我希望这是原因,而不是节省速度或人物数量。

除了已经说过的东西,用! 如果您不使用分号来编写javascript,则会非常有用:

 var i = 1 !function(){ console.log('ham') }() i = 2 (function(){ console.log('cheese') })() 

第一个示例按预期输出“ham”,但第二个示例会抛出错误,因为由于下面的括号,i = 2语句未终止。

同样在串联的JavaScript文件中,如果前面的代码缺less分号,则不必担心。 所以不需要共同的;(function(){})(); 确保你自己不会中断

我知道我的回答是有点晚,但我认为这还没有提到:)

首先,jsPerf显示使用! (UnaryExpression的)通常更快。 有时他们会平等的,但是当他们不是时,我还没有看到那些没有被击败的人的胜利: http : //jsperf.com/bang-function

这是在最新的Ubuntu上testing,最旧的(每说..)Chrome 8版本。所以结果可能会有所不同。

编辑:如何delete一些疯狂的东西?

 delete function() { alert("Hi!"); }(); 

void

 void function() { alert("Hi!"); }(); 

正如你在这里看到的,在javascript中执行自调用方法的最好方法是使用:

 (function(){}()); -> 76,827,475 ops/sec !function(){}(); -> 69,699,155 ops/sec (function(){})(); -> 69,564,370 ops/sec 

所以,否定“!” 而所有其他的一元运算符像+, – ,〜,delete,void,已经被告知了很多,总结一下:

 !function(){ alert("Hi!"); }(); 

要么

 void function(){ alert("Hi!"); }(); 

要么

 delete function(){ alert("Hi!"); }(); 

而更多的情况下与二元运算符的乐趣:)

 1 > function() { alert("Hi!"); }(); 

要么

 1 * function() { alert("Hi!"); }(); 

要么

 1 >>> function() { alert("Hi!"); }(); 

甚至

 1 == function() { alert("Hi!"); }(); 

离开三元为其他人:)