1 个回答

module表示一个文件模块,每个文件等价于这么一个对象:

module = {
    exports: {}
}

文件内部的module即此module对象,而exports即此module.exports,也就是说相当于额外定义一个变量var exports = module.exports,当你修改了module.exports实际上就已经覆盖了module对外的导出,而之后对exports就没用了。
相当于:

var module = {
    exports: {},
};
var exports = module.exports;
module.exports = 'something'
exports.name = function() {}

你在别的文件require时就是在导入这个module.exports对象。

// 假设这个require函数就是导入
function require(fileName) {
    var module = {
        exports: {},
    };
    var exports = module.exports;
    module.exports = 'something'
    exports.name = function() {}
    return module.exports;
}

var obj = require('./xxx.js')
console.log(obj) // obj is ???

差不多类似于这样的代码,你可以把书中的代码用webpack编译下看看最终输出就理解了
截屏2023-03-14 22.44.34.png
然后是你划线处的结果不同的说法,我猜测是想说明module.exports.nameexports.name分别指向两个函数定义,虽然这两个函数的逻辑完全一致,但后者会覆盖前者。jsFunction有个name属性用来输出函数名,假设我们把代码改成

// 假设此文件叫test.js
module.exports.name = function name1() {

}
exports.name = function name2() {

}

那么当我们

var obj = require('./test.js')
// obj.name即导出的name函数
console.log(obj.name.name) // 这里将打印name2
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题