2012-01-23 55 views
1

可能重複:
What do parentheses surrounding a JavaScript object/function/class declaration mean?變量聲明的語法? VAR A =(函數(){})()

我已經發現在一個網站下面的代碼。

var testModule = (function(){ 

    var counter = 0; 

    return { 

     incrementCounter: function() { 

      return counter++; 

     }, 

     resetCounter: function() { 

      console.log('counter value prior to reset:' + counter); 

      counter = 0; 

     } 

    }; 

})(); 

因此它遵循語法var a = (blah balh..)()

是什麼到底意味着什麼?變量聲明的含義如a =()() ..

+0

@Shark:當然......我會 –

+1

請注意,它不是'(blah blah)()',它是'(function(){blah})()'。也就是說,這個語法只對函數表達式有意義。 – nnnnnn

回答

5

它定義了一個一次性函數並立即執行它。您提供的名爲模塊模式的代碼 - 在這裏看到有關其屬性的詳細信息:http://www.yuiblog.com/blog/2007/06/12/module-pattern/

正常功能可能會喜歡這個創建:

var f1 = function() { 
    console.log('bar'); 
}; 

而且你可以隨後調用它像這樣:

f1(); 

但在你提供的示例中,該函數被定義且是執行一次,而函數返回具有兩種功能的對象:incrementCounterresetCounter。你可以這樣稱呼它們:testModule.incrementCounter()testModule.resetCounter()

當你有一個單獨的對象,並且你想封裝一些只能用於閉包中定義的函數的屬性時,模塊模式很有用。

2

執行匿名函數並將返回值分配給該變量。

+1

只是好奇,這可以被認爲是一個封閉與'function(){}();'不是一個閉包,只有一個匿名函數? –

+1

@Matt Lo:這些是等價的:function(){}()和(function(){})()推薦使用第二種形式作爲最佳實踐。 – ryanlahue

+0

@rla:'function(){}()'是一個'SyntaxError'。函數聲明需要一個名稱。您需要使用其他語法來消除聲明和匿名函數之間的歧義。 – 2012-01-23 04:21:17