JavaScript中的函數是的值。也就是說,一個函數是由一個對象來表示的,就像任何其他對象一樣,它可以是一個變量的值或參與表達式。
因此
(function() { ... })
是一個值,就像17
或"hello world"
是一個值。
當一個函數(作爲一個值)出現在一個表達式中,然後是(...)
,括號之間用逗號分隔的表達式列表,這是一個函數調用。
行,所以:
(function() { ... })()
創建函數(的值),然後調用無參數該功能。該函數對象,至少作爲該代碼的直接結果,不存儲在任何地方。它在函數調用完成後基本消失,並且該子表達式的整體值將是返回的函數。
將參數傳遞給該函數不大於參數傳遞到任何其他功能不同。在您引用的具體示例中,目的是防止由錯誤的「外來」代碼導致的某些異常情況。你真的例子應該閱讀:
(function(window, undefined) {
// code
})(this);
符號this
是保留字,它的值是運行時的完全控制之下。 (當然,它在一個本地執行上下文正是如此控制值。)當在全局範圍內進行評價,上述代碼確保內部匿名函數,符號「窗口」將是全局上下文的參考。那種結構的也是可以在上下文中使用除瀏覽器,如Node.js的,例如,在全球範圍內的不叫「窗口」的代碼是有用的。
爲什麼這個downvoted? – Pointy