2013-10-27 115 views
0
(function() { 
    var names = ["Sunday", "Monday", "Tuesday", "Wednesday", 
       "Thursday", "Friday", "Saturday"]; 
    provide({ 
    getDayName: function(number) { 
     return names[number]; 
    }, 
    getDayNumber: function(name) { 
     for (var number = 0; number < names.length; number++) { 
     if (names[number] == name) 
      return number; 
     } 
    } 
    }); 
})(); 

show(getDayNumber("Wednesday")); 

現在我正在閱讀eloquentjavascript.net,我在那裏發現了這樣的模塊模式。 但我覺得有點混亂,所以你可以向我解釋爲什麼我們需要把它放在函數 - >()後面。就我所知,它是自我調用的。 但爲什麼我們需要使它自我調用?模塊模式或模塊化

第二個問題爲什麼我們需要將我們的函數放在括號內(function)()。是否只是語法?

+0

因爲不然的話,它永遠不會運行。 – SLaks

+0

http://stackoverflow.com/questions/8228281/what-is-this-construct-in-javascript 1)';'之前的'()'立即調用'function'。 2)'function'的另一個括號將其區分爲* Expression *,因此可以立即調用('function'語句/聲明不允許它)。 –

回答

3

立即調用函數的重點是雙重的:首先,最明顯的是,它們立即調用自己。其次,函數中定義的所有變量都封裝在該函數中。

例如:這個函數執行

(function() { 
    var foo = "bar"; 
    window.bar = foo; 
})(); 

後,bar將是功能以外訪問,但foo不會。

至於括號中的函數,這會導致該函數被視爲一個表達式,然後可以執行。

(function (a) { console.log(a); }) ("foo"); 

在上面,「foo」將被記錄。沒有括號,你會得到一個語法錯誤。

編輯

另外值得一提的是,你可以使用(和偶爾會看到)的!function代替(function)使函數的表達式:

!function() {}(); 

這是一樣的

(function() {})(); 

除了它將返回值到一個布爾值,這是否定的,但在大多數情況下都會被忽略。