可能重複:
JavaScript: Why the anonymous function wrapper?
A Javascript function
How does the (function() {})() construct work and why do people use it?獨立括號
我看到在javascript一些代碼格式如下:
(
function()
{
//stmt
}
)();
爲什麼我們使用這些獨立的括號?謝謝。
可能重複:
JavaScript: Why the anonymous function wrapper?
A Javascript function
How does the (function() {})() construct work and why do people use it?獨立括號
我看到在javascript一些代碼格式如下:
(
function()
{
//stmt
}
)();
爲什麼我們使用這些獨立的括號?謝謝。
此代碼創建一個函數表達式,然後立即調用它。
這是一樣
var unnamed = function() { ... };
(unnamed)();
的獨立括號()
手段來執行的功能,在此代碼,它是一個匿名函數。
;
之前的最後兩個缺口直接執行匿名函數。其他兩個禁忌是可選的,只是某種約定。
這種模式通常用於不污染全局命名空間:
(function() {
var a = 42;
})();
alert(a); // a is undefined
保羅愛爾蘭有關於這個和其他JavaScript模式相當不錯的截屏:http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/
這是所謂的基礎Javascript中的模塊模式。請參閱以下文章瞭解更多信息:
http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
http://yuiblog.com/blog/2007/06/12/module-pattern/
從本質上講,作爲文章的狀態,這種模式是完美的保持隱私和狀態,也讓你的Javascript模塊鬆耦合和鏈接。
創建匿名函數並對其進行調用,從而避免對僅調用一次的函數造成名稱空間和內存的污染。
雖然類似:
var f = function() { ... };
f();
這種變異以避免創建變量f,從而節省了成本,以及避免命名空間衝突。
OP中的示例不是模塊模式,它是一個簡單的匿名函數表達式,可以立即執行。如果它實際上創建了一個可以在匿名函數外訪問的方法的對象,它只會是模塊模式 - 通常通過返回所述對象來完成,儘管還有其他方法。但是,還有其他非模塊原因可能會導致您將某些代碼封裝在匿名立即執行的函數中,例如爲特定計算創建一些臨時工作變量而不污染全局名稱空間。 – nnnnnn
我還是喜歡這些資源。他們很好。 – mihsathe
@nnnnnn:同意,這不是一種模式,而是一種模式的基礎。我相應地編輯了我的帖子。有一個upvote。 – Digbyswift