2

我试图了解以下两种我认为是相同功能的替代表示之间的区别。

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;
};

对比

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;

服务器.js

var apiRegistry1 = require('./includes/apiregistry1')(); // returns {key: moduledef ..}
var apiRegistry2 = require('./includes/apiregistry2'); //returns {}

apiRegistry1 的行为与我预期的一样,但 2 没有。在某种程度上,1 是一个函数并在调用它时进行评估是有道理的,这就是它起作用的原因,但我不明白为什么在模块打印值总是有效,但在它之外引用却不行。我缺少关于 require 工作原理的一些基本知识吗?

4

1 回答 1

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;
于 2013-06-20T06:06:04.543 回答