2013-02-01 50 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執行大量類型的強制操作,並且將對錶達式的評估與聲明不同。