我可以将节点全局变量作为GLOBAL
对象的属性来访问。
我可以用类似的方式访问模块范围变量吗?
e.g。
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 = /*...*/
或者将这些变量包装在对象中更好? e.g。
var fns = {
x: x = function(){/*...*/},
y: x = function(){/*...*/}
}
function aFn(param){
if(fns[param]){
fns[param]();
}
}
/*...*/
module.exports = /*...*/
答案 0 :(得分:2)
简短回答是否。
虽然在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];
};