2013-02-01 48 views

回答

4

任何这些符号都会将后面的函数转换为函数表达式,而不是函数声明。把他们放在一起只是为了好玩。


如果试图通过把()声明之后调用普通函数:

function() { 
    // this is a syntax error... 
}(); 

,你会得到一个语法错误:

SyntaxError: Unexpected token (

,因为你不能叫函数声明。


所以,人们通常包裹在括号中的匿名函数把它变成一个函数表达式:

(function() { 
    // this will execute immediately 
}()); 

可以实现被前面加任何那些符号一样的东西:

!function() { 
    // this will also execute immediately 
}(); 

欲了解更多信息,请参阅:http://kangax.github.com/nfe/#expr-vs-decl

0

除了作为风格水印之外,做长符号集有零点。

这组符号充当接下来的函数的操作,但什么都不做。在JS中,您可以编写1或+1(one)或!1(false)或!+1(仍然为false)。这只是那些对以下功能起作用的长链。因此!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1不会引发错误。但它的值是false

而且!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... }只是执行的功能和计算结果为假(但没有与反正值来完成)

然而,因为东西是存在的,它把函数定义为操作和评估立即起作用。但只是+function(){ ... }会做同样的事情。

0

再详细一点,每个这些操作符实际上都会对操作数进行类型强制操作。 +将把它后面的操作数转换为number-操作符也一样。 !是非运算符,并将操作数转换为boolean(true/false)。

要记住的另一件事是,在Javascript中,一切都可以评估某种价值。这可能是一个“真实”或“虚假”的值,也可能具有“数字”值(即使该值不是数字,也可以是“NaN”)。因此,如果您打开JSFiddle或Firebug,并且弄乱这些值对函数的作用,您可以看到它们也会产生某种新的返回值。

例如:

  1. !function(){}将评估为的false的值(因为胁迫的功能对象到布尔产生的true的值)。
  2. +function(){}将评估值为NaN(因为强制函数对象的数字产生NaN)。使用-可以看到相同的结果。
  3. !+function(){}产生真正的(胁迫一批价值NaN将产生false不虚产生true。
  4. !+-+-+!function(){}产生true(因为!function(){}产量false+false产量0,并且将继续在所有这些+-运营商,直到最后!0被评估为true)
  5. 应用像他们在你的例子中列出的运算符将在false,-1,0,1,true之间来回切换,直到所有运算符都被评估为止。

请注意,我检查了这些使用Firebug。浏览器之间可能存在差异,也许Firebug向我们展示了评估内容。 TL; DR是Javascript执行大量类型的强制操作,并且将对表达式的评估与声明不同。