可能重複:
What does the exclamation mark do before the function?
我一直在尋找通過Twitter的引導JavaScript代碼,我發現他們所有的插件都包裹在否定自我調用函數。
我知道function ($) { ... }(window.jQuery);
立即調用函數。
但什麼是!
呢?
可能重複:
What does the exclamation mark do before the function?
我一直在尋找通過Twitter的引導JavaScript代碼,我發現他們所有的插件都包裹在否定自我調用函數。
我知道function ($) { ... }(window.jQuery);
立即調用函數。
但什麼是!
呢?
1)如果你只是做:
function() { /* ... */ }();
你會得到一個錯誤。
JS不允許你發佈函數聲明(因爲「變量提升」的概念,這在技術上不正確,但對於很多人來說要容易得多)。
如果您使用聲明功能:
function myFunc() { /* ... */ }
JS引擎會在你的範圍內創建它們,創建範圍的變量之前 - 即使瓦爾都在頂部和功能都在底部。
所以,當你寫:
function myFunc() { /* ... */ }();
有一個錯誤,因爲這不連瓦爾存在的是,在目前的範圍可能會被內部調用,這是有保證的崩潰。
爲了進一步說,如果你不給你的函數聲明中的名字:
function() { /* ... */ }
...然後有一個錯誤,不管了,因爲你不能調用函數還,但你無法得到它,因爲它沒有名字,而你也沒有將它分配給一個變量。
運營商像()
或+
或!
- 任何這將迫使發動機,以評估未來無論發生什麼,都會讓你火一樣的功能:
+function() { /* ... */ }();
只要沒有可變監聽回報聲明,你很好。
2)此外,在!function() { /*...*/ }();
的情況下,如果該函數自然不具有返回語句,則它將返回undefined
。
的undefined
相反的是true
那樣被迫當...
...因此,如果你真的願意,你可以這樣做:
var success = !function() { /* ... */ }();
if (success) { doStuff(); }
參見:HTTP://計算器.com/questions/5827290/javascript-function-leading-bang-syntax –
'function($){...}(window.jQuery);'...*不*立即調用該函數。它引入了一個SyntaxError,這就是爲什麼你需要'!'*(或任何將導致函數被解釋爲表達式的一部分的運算符)*。 –
是的,我忘了考慮如何將它包裝在()中,我現在知道的是相同的! – Hailwood