2012-04-28 87 views
0

我讀another question,我看到了這一點:有人可以解釋下面一段Javascript代碼嗎?

var basketModule = (function() { 
var basket = []; //private 

return { //exposed to public 
     addItem: function(values) { 
      basket.push(values); 
     }, 
     getItemCount: function() { 
      return basket.length; 
     }, 
     getTotal: function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 
     } 
}()); 

能否請您解釋一下爲什麼他包裹功能(and)的?另外,return的目的是什麼?他能不能只寫self.addItem = ...等等?

回答

2

當你用一個parantheses包裝一個函數,並且在其末尾添加()時,它是一個自我執行的函數。

(function() x() { 
//do something; 
})(); 

而且,通過返回他使basket變量有點私人。嘗試從其他地方獲得basketModule.basket,並且您將得到未定義的內容。

0

注意最後一行中的括號:()。該函數被定義,並立即被稱爲: (function() { })();

return { ... }返回具有方法addItem

2

這就是所謂的javascript Module Pattern的對象。定義函數並立即將其調用到可防止變量位於全局空間中或定義函數名稱。

+0

我只會補充說這是al l部分技術稱爲unobtrusive JavaScript:http://en.wikipedia.org/wiki/Unobtrusive_JavaScript – 2012-04-28 11:31:38

0

代碼的意圖是用三種方法創建一個對象。 addItem,getItemCount和getTotal。他們都依賴籃子所代表的國家。

如果籃子是全局定義的,狀態將被暴露(並且可能只有一個變量籃子,這兩者都可能導致問題,因此通過包裝整個聲明,狀態被封裝並且只能從創建的對象訪問。

有殊途同歸,和親的和反對的都與風格,有多少你會需要一個特定類型的對象的其他方式。

包裝,因爲function(){}()不會解析function(){}()需要

相關問題