0

可能重複:
What does the exclamation mark do before the function?

我一直在尋找通過Twitter的引導JavaScript代碼,我發現他們所有的插件都包裹在否定自我調用函數。

我知道function ($) { ... }(window.jQuery);立即調用函數。

但什麼是!呢?

+0

參見:HTTP://計算器.com/questions/5827290/javascript-function-leading-bang-syntax –

+0

'function($){...}(window.jQuery);'...*不*立即調用該函數。它引入了一個SyntaxError,這就是爲什麼你需要'!'*(或任何將導致函數被解釋爲表達式的一部分的運算符)*。 –

+0

是的,我忘了考慮如何將它包裝在()中,我現在知道的是相同的! – Hailwood

回答

3

1)如果你只是做:

function() { /* ... */ }(); 

你會得到一個錯誤。
JS不允許你發佈函數聲明(因爲「變量提升」的概念,這在技術上不正確,但對於很多人來說要容易得多)。
如果您使用聲明功能:

function myFunc() { /* ... */ } 

JS引擎會在你的範圍內創建它們,創建範圍的變量之前 - 即使瓦爾都在頂部和功能都在底部。

所以,當你寫:

function myFunc() { /* ... */ }(); 

有一個錯誤,因爲這不連瓦爾存在的是,在目前的範圍可能會被內部調用,這是有保證的崩潰。

爲了進一步說,如果你不給你的函數聲明中的名字:

function() { /* ... */ } 

...然後有一個錯誤,不管了,因爲你不能調用函數還,但你無法得到它,因爲它沒有名字,而你也沒有將它分配給一個變量。

運營商像()+! - 任何這將迫使發動機,以評估未來無論發生什麼,都會讓你火一樣的功能:

+function() { /* ... */ }(); 

只要沒有可變監聽回報聲明,你很好。

2)此外,在!function() { /*...*/ }();的情況下,如果該函數自然不具有返回語句,則它將返回undefined
undefined相反的是true那樣被迫當...

...因此,如果你真的願意,你可以這樣做:

var success = !function() { /* ... */ }(); 
if (success) { doStuff(); }