2013-04-23 88 views
2

我看着this非常酷的片段,我在防止函數被調用奇怪匿名的JavaScript函數調用

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+! 
function(d, w){ 
    ... 
}(document, window); 

的JS 和刪除碰到這種怪異的線,我包裹着的功能( ),因爲它應該是和它按預期工作。

(function(d, w){ 
    ... 
})(document, window); 

所以我的問題是什麼是古怪的線,爲什麼它的工作?我的野客是這是一種IIFE ...

+0

它不是'!'操作符棘手..! – rab 2013-04-23 13:21:45

+1

詳細說明重複項:'+','''和'!'是與鏈接副本中單獨的'!'完全相同的一元運算符。 – apsillers 2013-04-23 13:21:54

+0

@過濾器,這些重複是不必要的? – MimiEAM 2013-04-23 15:10:03

回答

11

而且你是對的,這是一個Immediately-Invoked Function Expression (IIFE)

可以重寫

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+! 
function(d, w){ 
    ... 
}(document, window); 

!function() { 
    ... 
}() 

它仍然有效。這是因爲!是一元運算符(就像+,-~-見https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operators)。 預期一個表達式的一元運算符(並進行評估!)後。表達式可以是一個函數調用。

然而

!function() { 
    ... 
}() 

只是另一種表達,所以你可以把其他一元運算符在它的前面:

+!function() { 
    ... 
}() 

如你願意,你可以繼續這種模式。

說明:以這種方式調用匿名函數會忽略函數的返回值。所以只有使用這個,如果你對返回值不感興趣。

編輯:添加了一個極好的參考http://benalman.com/news/2010/11/immediately-invoked-function-expression/,達夫在他的答案中提到。

+0

感謝您的澄清:) – MimiEAM 2013-04-23 15:10:54

4

訣竅實際上是那裏的單個!運算符(整個第一行實際上做同樣的事情)。這將很好的工作:

!function(d, w){ 
    ... 
}(document, window); 

像往常一樣,我可以推薦本Almans大文章上Immediately-Invoked Function Expressions

+0

謝謝,我希望我可以接受這兩個答案 – MimiEAM 2013-04-23 15:11:22