2011-03-10 71 views
5

可能重複:
What is the purpose of wrapping whole Javascript files in anonymous functions like 「(function(){ … })()」?JavaScript表示法:(function(){...})();

您好所有,

我已經看到使用這個標誌的幾個JavaScript文件:

開始JavaScript文件中:

(function() { 
// All functions go here. 
// Can someone say what the wrapping nameless function is used for? 
})(); 

也與原型庫,這似乎是可能的:

function $() { 
// Prototype $-wrapping function. 
} 

有人能請解釋一下上面兩個代碼片段,其用途和他們的區別是什麼?有些關鍵字可以幫助我更好地瞭解這種符號/技術(它是如何命名的),因此我可以對其執行Google搜索... :)

謝謝!

+1

可能的重複http://stackoverflow.com/questions/2421911 – Gumbo 2011-03-10 08:56:35

+0

絕對是上述的重複,我相信比以下任何更好的解釋。 – necromancer 2011-03-10 09:02:21

+0

那個還包含有趣的信息,謝謝Gumbo。我還會在另一個線索中閱讀答案!我在發佈這篇文章之前進行了一次搜索,但並不確定如何使用關鍵字來找到類似的問題。 :) – Sander 2011-03-10 09:02:49

回答

6

在第一個示例中,爲避免全局名稱空間混亂,人們將其代碼置於匿名函數中以實現作用域原因。用奇怪的括號語法來一步一步地定義和執行函數; ()最後具有執行函數本身的含義

所以在這個匿名函數中,你可以定義function apple(){},它只能在匿名函數中訪問。如果你正在創建一個庫,並且只希望某些東西混亂你的全局名稱空間,這很好。

你的第二個例子只是一個簡單的函數$。許多圖書館喜歡使用這個名字,因爲它簡潔明瞭,而且每當你想引用圖書館名字空間時都需要輸入,所以越短越好。

3

我搜索「的JavaScript包裝功能部件」和第一主打爲this,它說:

This method doesn't add any new symbols to the global or LIB spaces. 

我不明白這個問題的第二部分:function $() { ... }不是「無名」功能:它的名字叫$!如果你喜歡功能$這是我知道做這種事最直接的方法。

+0

忽視它確實不是一個無名函數,我的不好:)編輯在我的問題。 – Sander 2011-03-10 08:49:41

3

的annonymous函數被定義

function() { 
} 

,然後立即稱爲

() 

額外()包圍所述功能是迫使解釋治療功能的表達式。 Javascript將任何以function關鍵字開頭的語句視爲一個聲明,所以它不能立即被調用。

其目的是爲了避免污染全局命名空間。該函數中定義的所有變量都是該函數的局部變量。

Google for module pattern。

1

第一個是所謂的直接功能。你可以閱讀更多關於這個功能模式here

相關問題