在瀏覽器中,頂級範圍是全局範圍。這意味着在瀏覽器中,如果你在全局範圍內,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),只要有可能。封裝在固體軟件工程中是一個非常重要的概念。 –