javascript函数领先爆炸!句法

时间:2011-04-29 02:41:30

标签: javascript syntax

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

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

作为更常见的替代

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

用于自我调用匿名函数。

我想知道一些事情。首先,允许顶级示例实际工作的是什么?为了使这个陈述在语法上正确,为什么必要的爆炸?我也被告知+有效,我相信其他人,代替!

第二,有什么好处?我所能说的只是它节省了一个角色,但我无法想象吸引众多采用者会带来如此巨大的好处。我还缺少其他一些好处吗?

我能看到的唯一其他差异是自调用函数的返回值,但在这两个示例中,我们并不真正关心函数的返回值,因为它仅用于创建闭包。那么有人可以告诉我为什么可能会使用第一种语法吗?

6 个答案:

答案 0 :(得分:93)

理想情况下,你应该能够完成所有这些:

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

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

实现这一目标的最短形式是使用某种表达,例如UnaryExpression(以及CallExpression):

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

或者为了好玩:

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

或者:

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

甚至:

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

答案 1 :(得分:72)

在Javascript中,以function开头的行应该是函数语句,看起来应该是

function doSomething() {
}

自我调用函数,如

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

不适合该表单(并且会在第一个打开的paren处导致语法错误,因为没有函数名称),因此括号用于描述匿名函数表达式

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

但是创建表达式的任何东西(与函数语句相反)都可以,因此!。它告诉解释器这不是函数声明。除此之外,运算符优先级指示在否定之前调用该函数。

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

答案 2 :(得分:44)

除了已经说过的东西,用的语法!如果你用不带分号的javascript编写是很有用的:

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

i = 2
(function(){
  console.log('cheese')
})()

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

同样在连接的javascript文件中,如果前面的代码缺少分号,则不必担心。所以不需要共同的;(function(){})();确保你自己不会破坏。

我知道我的答案有点迟了但我认为还没有提到:)

答案 3 :(得分:6)

首先,jsPerf表明使用!(UnaryExpression)通常更快。有时它们是平等的,但是当它们不相同时,我还没有看到无条件胜过其他人的胜利:http://jsperf.com/bang-function

这是在最新的Ubuntu上测试的,其中包含最老的(每个说..)Chrome版本8.因此结果可能会有所不同。

编辑:像delete这样疯狂的事情怎么样?

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

void

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

答案 4 :(得分:3)

所以,否定“!”和所有其他一元运算符如+, - ,〜,删除,无效,已被告知很多,只是总结一下:

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

或者

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

或者

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

还有一些案例binary operators可以获得乐趣:)

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

或者

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

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

甚至

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

离开其他人的三元组:)

答案 5 :(得分:3)

正如您所看到的here,在javascript中执行自调用方法的最佳方法是使用:

(function(){}()); -> 76,827,475 ops/sec

!function(){}();  -> 69,699,155 ops/sec

(function(){})(); -> 69,564,370 ops/sec