我正在經歷一段代碼在這裏http://cssdeck.com/labs/bjiau4dy,我看到這個Javascript代碼箱 -什麼這些字符做在Javascript
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
是什麼呢?爲什麼它不會在控制檯中拋出錯誤?
謝謝!
我正在經歷一段代碼在這裏http://cssdeck.com/labs/bjiau4dy,我看到這個Javascript代碼箱 -什麼這些字符做在Javascript
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
是什麼呢?爲什麼它不會在控制檯中拋出錯誤?
謝謝!
任何這些符號都會將後面的函數轉換爲函數表達式,而不是函數聲明。把他們放在一起只是爲了好玩。
如果試圖通過把()
聲明之後調用普通函數:
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
除了作爲風格水印之外,做長符號集有零點。
這組符號充當接下來的函數的操作,但什麼都不做。在JS中,您可以編寫1
或+1(one)或!1
(false)或!+1(仍然爲false)。這只是那些對以下功能起作用的長鏈。因此!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1
不會引發錯誤。但它的值是false
。
而且!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... }
只是執行的功能和計算結果爲假(但沒有與反正值來完成)
然而,因爲東西是存在的,它把函數定義爲操作和評估立即起作用。但只是+function(){ ... }
會做同樣的事情。
再詳細一點,每個這些操作符實際上都會對操作數進行類型強制操作。 +
將把它後面的操作數轉換爲number
,-
操作符也一樣。 !
是非運算符,並將操作數轉換爲boolean
(true/false)。
要記住的另一件事是,在Javascript中,一切都可以評估某種價值。這可能是一個「真實」或「虛假」的值,也可能具有「數字」值(即使該值不是數字,也可以是「NaN
」)。因此,如果您打開JSFiddle或Firebug,並且弄亂這些值對函數的作用,您可以看到它們也會產生某種新的返回值。
例如:
!function(){}
將評估爲的false
的值(因爲脅迫的功能對象到布爾產生的true
的值)。+function(){}
將評估值爲NaN
(因爲強制函數對象的數字產生NaN
)。使用-
可以看到相同的結果。!+function(){}
產生真正的(脅迫一批價值NaN
將產生false
不虛產生true。!+-+-+!function(){}
產生true(因爲!function(){}
產量false
,+false
產量0
,並且將繼續在所有這些+
和-
運營商,直到最後!0
被評估爲true)false
,-1,0,1,true
之間來回切換,直到所有運算符都被評估爲止。請注意,我檢查了這些使用Firebug。瀏覽器之間可能存在差異,也許Firebug向我們展示了評估內容。 TL; DR是Javascript執行大量類型的強制操作,並且將對錶達式的評估與聲明不同。