将NodeJS模块范围变量作为对象进行访问
我可以访问节点全局变量作为GLOBAL
对象的属性。
我可以以类似的方式访问模块范围变量吗?
EG
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 = /*...*/
回答如下:
简短的回答是否定的。
虽然在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];
};
将NodeJS模块范围变量作为对象进行访问
我可以访问节点全局变量作为GLOBAL
对象的属性。
我可以以类似的方式访问模块范围变量吗?
EG
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 = /*...*/
回答如下:
简短的回答是否定的。
虽然在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];
};