2013-10-08 65 views
2

Module Pattern example from Addy Osmani,專用功能被分配給一個變量,如本例所示:爲什麼將函數分配給模塊模式中的變量?

var myNamespace = (function() { 

    var myPrivateVar, myPrivateMethod; 

    // A private counter variable 
    myPrivateVar = 0; 

    // A private function which logs any arguments 
    myPrivateMethod = function(foo) { 
     console.log(foo); 
    }; 

    return { 

    // A public function utilizing privates 
    myPublicFunction: function(bar) { 

     // Increment our private counter 
     myPrivateVar++; 

     // Call our private method using bar 
     myPrivateMethod(bar); 

    } 
    }; 

})(); 

我會簡單地寫私有函數爲:

function myPrivateMethod(foo) { 
     console.log(foo); 
    }; 

是否有任何理由來分配如果函數沒有被用作委託,那麼該函數是一個變量?我正在看一些使用這種模式的代碼,並且我發現很難遵循。例如:

var _initializeContext = function() { // many lines of code } 
+2

[VAR functionName =函數(){} VS功能使用functionName(){}(http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname)可能能夠回答這個問題。這兩種形式之間的技術區別在於函數或者var是否被掛起。但是,已經處於範圍的頂端,它主要是一種文體選擇。 –

+1

在這種情況下,編寫私有函數的兩種方式之間沒有顯着差異。這只是個人風格。我沒有看到你在「揭示模塊模式」一節中提到的語法,它來自模塊模式部分。 – Barmar

+0

@Barmar你是對的,我編輯了標題。 –

回答

2

這是函數聲明與函數表達式問題。在某種程度上,這是一種文體選擇。你需要知道的是函數聲明被JS解釋器提升,而函數表達式不是。有些人更喜歡使用函數表達式,因爲他們不喜歡他們的代碼重新排列的想法。

你可能想看看:

var functionName = function() {} vs function functionName() {} http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/ http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

相關問題