我试图理解以下两个我认为是相同功能的替代表示之间的区别。
apiRegistry1.js
module.exports = function () {
var apiRegistry = {};
var files = fs.readdirSync('./apis');
for (var index in files) {
var fileName = files[index];
var module = fileName.split('.')[0];
apiRegistry[module] = require('../apis/' + module);
}
// console.log(apiRegistry) --> Prints {key: moduledef ..}
return apiRegistry;
};
VS
apiregistry2.js
var apiRegistry = {};
var files = fs.readdirSync('./apis');
for (var index in files) {
var fileName = files[index];
var module = fileName.split('.')[0];
apiRegistry[module] = require('../apis/' + module);
}
// console.log(apiRegistry) --> Prints {key: moduledef ..}
module.exports = apiRegistry;
server.js
var apiRegistry1 = require('./includes/apiregistry1')(); // returns {key: moduledef ..}
var apiRegistry2 = require('./includes/apiregistry2'); //returns {}
apiRegistry1表现得像我预期的那样,但是2没有。在某种程度上,1是一个函数并且在被调用时进行评估是有道理的,这就是它工作的原因,但我不明白为什么在模块中打印值总是有效,但是在它没有。关于如何要求我缺少的作品有什么基础吗?
答案 0 :(得分:3)
var module = fileName.split('.')[0];
是罪魁祸首。
由于JavaScript中的作用域如何工作,module
变量不是for
循环的本地变量,而是整个文件。因此,当你最后使用它时:
module.exports = apiRegistry;
您在自己的exports
变量上设置module
属性,而不是您希望使用的一个节点。更改为使用其他变量名称可以解决您的问题:
var apiRegistry = {};
var files = fs.readdirSync('./apis');
for (var index in files) {
var fileName = files[index];
var myModule = fileName.split('.')[0];
apiRegistry[myModule] = require('../apis/' + myModule);
}
// console.log(apiRegistry) --> Prints {key: moduledef ..}
module.exports = apiRegistry;