2016-04-25 51 views
4

我可以訪問節點全局變量作爲屬性GLOBAL對象。訪問NodeJS模塊作用域變量作爲對象

我可以以類似的方式訪問模塊範圍變量嗎?

例如

var fns_x = function(){/*...*/}; 
var fns_y = function(){/*...*/}; 

function aFn(param){ 
    /* moduleScope = something that allows me to access module scope variables */ 
    if(moduleScope['fns_' + param]){ 
     moduleScope['fns_' + param](); 
    } 
} 

/*...*/ 
module.exports = /*...*/ 

或者最好把這些變量包裝在對象中?例如

var fns = { 
    x: x = function(){/*...*/}, 
    y: x = function(){/*...*/} 
} 

function aFn(param){ 
    if(fns[param]){ 
     fns[param](); 
    } 
} 

/*...*/ 
module.exports = /*...*/ 
+2

爲什麼不直接導出'fns'(修改第二個例子)?我沒有看到需要檢查函數是否被聲明的函數。 – Andy

+0

剛剛遇到同樣的問題 - 想要讀取一個目錄,並要求它的所有文件作爲模塊範圍內的變量,但我不想包裝它們。 – Megakoresh

回答

1

簡短回答是

儘管在ECMAScript規範中變量聲明在模塊的環境記錄設置中可用,但它被指定爲不應以編程方式訪問。

是不可能的ECMAScript程序直接訪問或操縱這樣的值 [spec]

一個解決方法是保持一個專用變量作爲你的函數的容器和暴露的查找功能。

var registry = { 
    x: function() {}, 
    y: function() {}, 
}; 


module.exports = function (prop) { 
    return registry[prop]; 
}; 

注意模塊代碼的靜態分析會丟失這種方式。

您也可以綁定到全局環境,但您有冒險覆蓋模塊全局範圍中設置的重要變量。

var that = this; 

that.x = function() {}; 
that.y = function() {}; 

module.exports = function (prop) { 
    return that[prop]; 
};