1个回答
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
编译下看看最终输出就理解了然后是你划线处的结果不同的说法,我猜测是想说明module.exports.name
和exports.name
分别指向两个函数定义,虽然这两个函数的逻辑完全一致,但后者会覆盖前者。js
的Function
有个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
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容