2013-01-18 78 views
3

使用下面的代碼,除了手動指定外,是否有一種方法只導出名稱不以下劃線開頭的函數和變量?Javascript namespacing - 如何導出基於命名的函數範圍內定義的函數和變量?

var myapp = myapp || {}; 
myapp.utils = (function() { 
    var 
    CONSTANT_A = "FOO", 
    CONSTANT_B = "BAR"; 

    function func() {} 
    function _privateFunc() {} 

    return {//return all variables and functions whose name does not have the "_" prefix.} 
}()); 
+4

我不認爲你可以訪問當前的棧幀除了'arguments'。如果按照慣例這樣做,可以翻轉它,使用名爲'_'的「exports」對象,並通過執行'_.func = function(){...}來導出函數' – millimoose

+2

您是否考慮過爲希望導出的所有功能和屬性設置單獨的對象? – kinsho

+0

@millimoose - 這是我一直在考慮的另一種方法。這種方法唯一的缺陷是,當訪問函數中的變量時,我必須包含名稱空間名稱(在這種情況下爲'_')。防爆。在'func()'中,我必須調用'_.CONSTANT_A'而不是'CONSTANT_A'。雖然這只是一個小麻煩。 – tamakisquare

回答

5

您的想法需要能夠列出本地範圍內的所有變量。不幸的是,JavaScript不能做到這一點。見this related question

有兩種方法我已經看到了這個來完成:

1)將每個變量時,他們定義爲一個對象要導出:

var myapp = myapp || {}; 
myapp.utils = (function() { 
    var exports = {}; 

    exports.CONSTANT_A = "FOO", 
    exports.CONSTANT_B = "BAR"; 

    exports.func = function func() {} 

    function _privateFunc() {} 

    return exports; 
}()); 

2)或列出所有在對象的最後出口文字:

var myapp = myapp || {}; 
myapp.utils = (function() { 
    var 
     CONSTANT_A = "FOO", 
     CONSTANT_B = "BAR"; 

    function func() {} 
    function _privateFunc() {} 

    return { 
     CONSTANT_A: CONSTANT_A, 
     CONSTANT_B: CONSTANT_B, 
     func: func 
    }; 
}()); 

我見過兩種(甚至兩種混合使用)在實踐中。第二個看起來更迂腐,但也允許讀者查看單個代碼段並查看該函數返回的整個接口。

+0

正確,但如果將它們聲明爲形式參數,則可以使用arguments對象來訪問它們:'function(foo,bar){for(var p in arguments){...}}'。 – RobG

+0

感謝您的參考和建議。 – tamakisquare