2011-11-29 42 views
0

以下是哪種類型的函數,哪些是它們的最佳用途?請解釋此javascript函數定義及其最佳用法(模塊模式)

var f = function(){ 
    var a = 0; 
    return { 
     f1 : function(){ 
     }, 
     f2 : function(param){ 
     } 
    }; 
}(); 

我試圖將其轉換爲:

var f = { 
    a : 0, 
    f1: function(){ 
    }, 
    f2: function (param){ 
    } 
} 

,但似乎並沒有以同樣的方式。

+0

爲什麼關閉這個問題?目前我正在使用這個功能,但真的不明白它是如何工作的! –

回答

2

這只是一個簡單的舊函數,立即被調用,並返回一個對象,然後被f引用。

返回對象引用的函數保留了引用a變量的能力。

立即調用的功能以外,沒有任何代碼可以引用a因爲您可以控制通過導出的功能究竟發生了什麼a所以它得到了一些保護。

此模式有時稱爲模塊模式


關於你更新的問題,因爲a現在是對象的公開可用財產這是行不通的一樣。

對於函數引用它,要麼他們會做的事:

f.a; 

,或者如果功能將從f對象調用,他們可以這樣做:

this.a; 

就像這樣:

var f = { 
    a : 0, 
    f1: function(){ 
     alert(this.a); 
    }, 
    f2: function (param){ 
     this.a = param; 
    } 
} 

f.f2(123); 

f.f1(); // alerts 123 

但關鍵是a是公開的。任何有權訪問f的代碼都可以訪問f.a,因此可以在不使用您的f1f2函數的情況下對其進行更改。

這就是第一個代碼的美麗。您可以精確控制a發生的情況。

+0

+1'module pattern'好的,tHX。 –

1

這是一個簡單的函數來創建和返回一個對象。它立即執行,其結果保存到您的變量f

它首先聲明一個本地(或私有)變量a,僅在函數的作用域中可見。然後它構造一個對象,它具有成員f1f2,它們都是函數。由於這個返回對象是在聲明的同一範圍內聲明的,所以f1和f2都可以訪問a。

您的轉換隻是創建一個對象。在你有一個函數可以創建無限的對象之前,你現在只有一個對象,沒有更多。我不確定它爲什麼不起作用,但有一個主要區別是現在世界可以看到a,在這之前它對返回對象是私有的。

+0

+1我在FF插件中使用它。不要以第二種方式工作。 –

1

基本上創建一個「類」 - JS沒有類,所以一個類基本上是一個函數,如你的函數f

您發佈的代碼有趣的是它創建了一個私有變量a和兩個公共職能f1f2。它們是公共的,因爲構造函數 - 外部函數 - 返回它們。

這是組織和封裝JS代碼的常用模式。

你可以閱讀更多關於它here

+0

+1非常清楚。謝謝。 –