在浏览器中,顶级范围是全局范围。这意味着在浏览器中,如果你在全局范围内,var的东西将定义一个全局变量。在Node.js中,这是不同的。顶级范围不是全球范围;在Node.js模块内的var内容对于该模块是本地的。使用下面的代码,而不是
global.TEST1 = require('./test1.js');
global.TEST2 = require('./test2.js');
function DoIt(str){
var obj = global[str];
obj.DoThings();
}
DoIt('TEST1');
DoIt('TEST2');
编辑
由于编辑全局对象是不好的做法,你可以用两种不同的方式解决这个问题。第一种方法是创建变量,您将在其中存储要使用字符串访问的导入模块和其他对象。
var imps = {};
imps.TEST1 = require('./test1.js');
imps.TEST2 = require('./test2.js');
function DoIt(str){
var obj = imps[str];
obj.DoThings();
}
DoIt('TEST1');
DoIt('TEST2');
第二种方式是覆盖require
功能,所有导入模块存储到imps
变量(当然,如果你想其他的东西添加到imps
变量,你需要做的是像第一个例子)。
var imps = {};
require = function(a){
return function(b, c){
imps[b] = a(c);
};
}(require);
require('TEST1', './test1.js');
require('TEST2', './test2.js');
function DoIt(str){
var obj = imps[str];
obj.DoThings();
}
DoIt('TEST1');
DoIt('TEST2');
注:通过它连接到'global',这些变量[成为提供给所有* *模块。(https://nodejs.org/api/globals.html#globals_global_objects ) –
@MikeC。为什么它应该是一个问题? OP已经写过他的代码,像全局变量是全局对象的一部分。没有人通常会将全局对象的内置键作为某个导入模块的名称进行覆盖,所以不存在影响模块加载过程的危险。 – 2016-07-14 17:14:56
OP只是在刺探如何做到这一点,但他们有什么不起作用。我并不担心它会影响模块加载过程(尽管我认为这也是一个问题)。这是[你应该真的避免全局变量](http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil),只要有可能。封装在固体软件工程中是一个非常重要的概念。 –