2016-04-25 55 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]; 
};