3

我想避免爲一個方法記住兩個名字,一個是公開的,一個是私人訪問的。從這個意義上說,在這種情況下,如果您爲兩者使用相同的名稱,腳本會失敗?下面的代碼何時失敗?揭示模塊模式命名約定

var TestClass = function() { 
    function showMessage(text) { 
     $("div").text(text); 
    } 
    return { 
     showMessage: showMessage 
    }; 
}(); 

我已經嘗試過在this fiddle,它工作正常在FF,IE,Chrome瀏覽器,Safari瀏覽器。 JSLint也無話可說。

我經常看到人們命名私有方法_showMessageshowMessageFn。這是否有很好的理由?

答案我正在尋找的是,它無論是在某些情況下出現故障,可能會造成混淆,或者說,它只是JavaScript的人發明了約定顯得聰明。

+0

這個工作正常 - 你在內部函數的上下文中定義了一個名爲showMessage()的函數,然後通過導出的對象文本的showMessage屬性來確定和引用它。只有我能看到的問題是,你應該將函數調用包裝在parens中,以使其更具可讀性。 – 2012-08-02 14:51:50

+0

謝謝。如果您將它添加爲答案,我會接受它。 – 2012-08-02 20:36:11

回答

2

工作正常 - 您在內部函數的上下文中定義一個名爲showMessage()的函數,然後將其分配給導出的對象文字的showMessage屬性。

屬性名稱可以any valid identifier,所以showMessage當然是完全有效的。在你的例子中,function showMessage(text)在內部範圍內創建一個名爲showMessage的標識符,引用一個函數定義。然後創建一個單獨的標識符showMessage作爲property name on the object literal,它被分配了內部標識符引用的函數的值。兩個標識符具有相同名稱的事實是不相關的,因爲它們不存在於相同的範圍內。

唯一的問題我可以看到的是,你應該包裝在括號函數調用,否則就不是立即清楚地向讀者該函數是自調用。

所以這樣的:

var TestClass = function() { 
    ... 
}(); 

變爲這樣:

var TestClass = (function() { 
    ... 
}()); 

原因私有方法經常用下劃線前綴僅僅是一種廣泛使用的約定 - 這表明,該方法旨在private(Javascript不支持訪問修飾符,所以任何未封裝在閉包中的屬性或方法都可以從外部範圍訪問)。 this StackOverflow quesion接受的答案完美。

0

你在這裏做的是返回一個包含你定義的函數對象的對象。

我認爲,基本上它是一種方法來顯示您是否在創建它的範圍內或在不同的範圍內訪問函數。