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!"); }();
离开三元为其他人:)