我在不同/相同目录中有两个具有相同代码的模块。它返回一个带有闭包的对象。返回的对象具有两个属性init和log。 init方法将一个函数作为参数,并将其分配给闭包。
// module1.js
module.exports = function () {
var moduleInstance = this;
moduleInstance.logger = function () {
console.log('module 1 default logger')
};
return {
init: function (logger) {
moduleInstance.logger = logger
},
log: function () {
console.log('in module 1 log function');
moduleInstance.logger();
}
}
}();
// ./module2.js
module.exports = function () {
var moduleInstance = this;
moduleInstance.logger = function () {
console.log('module 2 default logger')
};
return {
init: function (logger) {
moduleInstance.logger = logger
},
log: function () {
console.log('in module 2 log function');
moduleInstance.logger();
}
}
}();
如果我导入2个模块,请在我的代码中:
const module1 = require('./module1');
const module2 = require('./module2');
module1.init(function () {
console.log('logger 1')
});
module2.init(function () {
console.log('logger 2')
});
module1.log();
module2.log();
// expected output
// in module 1 log function
// logger 1
// in module 2 log function
// logger 2
// actual output
// in module 1 log function
// logger 2
// in module 2 log function
// logger 2
根据文档,节点应基于文件名缓存模块。但是在这里它没有按预期工作。
需要了解其工作原理吗?
答案 0 :(得分:1)
这是问题所在:var moduleInstance = this;
。 this
引用了module.exports
对象,因此在您的代码中您实际设置并再次重置了module.exports.logger = ...
。将此行替换为var moduleInstance = {};
,您将获得预期的结果:
in module 1 log function
logger 1
in module 2 log function
logger 2