为什么狼书卷1 188页中说这两种输出不一样?

作者站长头像
站长
· 阅读数 4

为什么狼书卷1 188页中说这两种输出不一样?

回复
1个回答
avatar
test
2024-07-07

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编译下看看最终输出就理解了answer image然后是你划线处的结果不同的说法,我猜测是想说明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
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容