2010-03-11 104 views
53

我正在嘗試閱讀原型來源。我已經到了這個部分(不幸的是,這個片段正在開始)。JavaScript中的函數聲明之後的空括號()是什麼?

這是什麼意思?

Browser: (function(){ 
    var ua = navigator.userAgent; 
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; 
    return { 
     IE:    !!window.attachEvent && !isOpera, 
     Opera:   isOpera, 
     WebKit:   ua.indexOf('AppleWebKit/') > -1, 
     Gecko:   ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, 
     MobileSafari: /Apple.*Mobile.*Safari/.test(ua) 
    } 
    })(), 

我指的是逗號前的最後一行?

+1

注意:根據jslint,您應該將最後執行的括號移到函數圓括號內:'(function(){...}() )' – ErikE 2011-06-16 05:46:29

+0

@ErikE他們最終做同樣的事情,雖然。看到這個問題:http://stackoverflow.com/questions/6645766/why-are-parenthesis-used-to-wrap-a-javascript-function-call – 2012-12-05 22:59:31

+0

沒有任何爭論,他們做同樣的事情。這是一種文體上的考慮,因爲通過不將執行括號放在外部對中,可能不清楚返回的是結果*而不是函數本身*。 – ErikE 2012-12-05 23:11:57

回答

40

該代碼正在定義一個匿名函數((function(){ ... })位),然後調用它(不帶參數)。然後,它將該值分配給大概在您的代碼片段之外定義的對象的Browser屬性。

你也可以某處定義函數:

function myFunction() { 
    var ua = navigator.userAgent; 
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; 
    return { 
     IE:    !!window.attachEvent && !isOpera, 
     Opera:   isOpera, 
     WebKit:   ua.indexOf('AppleWebKit/') > -1, 
     Gecko:   ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, 
     MobileSafari: /Apple.*Mobile.*Safari/.test(ua) 
} 

然後調用它:

var foo = myFunction(); 

,然後分配值:

... 
Browser: foo, 
... 

一個缺點與做的是方式是你用一個函數和一個你不會在其他地方使用的變量「污染你的命名空間」 。第二個問題是你不能在你的函數定義中使用任何局部範圍變量的值(匿名函數的行爲如同閉包)。

5

這是一個簡單的函數調用,與foo()沒什麼區別,只是它調用一個匿名函數文本,函數的結果被賦予Browser屬性。

11

它調用剛剛聲明的匿名函數,有效地導致評估「塊」。

27

(function() {})創建一個匿名函數。

()添加到最後調用剛剛創建的函數。

在這個特定函數的情況下,匿名函數返回Browser對象的幾個屬性。所以,最終的布爾值爲例如Browser.IE,Browser.Opera等。

+2

哪一個是正確的符號? '(function(){}());'OR'(function(){})();' - 我在最後談論圓括號順序 – ayjay 2014-06-19 23:29:13

+2

你的第一個是對的@ayjay – Jonesopolis 2014-07-01 15:17:43

+2

@ayjay其實任何一個都是對的,但是Crockford使用前者,所以我願意這樣做。[http://javascript.crockford.com/code.html](http://javascript.crockford.com/code.html) – GFoley83 2014-07-09 05:05:49

相關問題