将NodeJS模块范围变量作为对象进行访问

时间:2016-04-25 10:18:09

标签: javascript node.js

我可以将节点全局变量作为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 = /*...*/

1 个答案:

答案 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]; 
 };