关于exports和module.exports的问题
发布于 5 个月前 作者 qqxwbtt 367 次浏览 来自 问答

今天遇到一个问题求解释,我打了个测试代码复现: test1.js文件: var test2 = require("./test2"); function test1(){ console.log(“test1”); } module.exports = { test1: test1 }; //exports.test1 = test1; test2.test2() test2.js文件: var test1 = require("./test1"); function test2(){ console.log(“test2”); test1.test1(); } module.exports = { test2: test2 }; 在test1文件中,若使用module.exports的情况,由于test1和test2文件的相互引用 会报错 TypeError: test1.test1 is not a function 但是test1文件中改为exports.test1 = test1; 则不会报这个错误。这是为什么;引用的不都是module.exports吗。。

3 回复

test2 中的 var test1 = require("./test1"); 得到一个空对象,因为此时 test1 并没有加载完成

而这个空对象和 test1 中的 module.exports 以及 exports 指向的对象一致,所以你在后面的 test1 中调用 test2.test2() 时,由于调用此函数的上一行执行了 exports.test1 = xxx,因此执行 test2() 时空对象中已经有了 test1 方法了,所以不会报错;

但是 module.exports = {} 的赋值方式,实际上是让 module.exports 的地址指向了一个新对象,此时 test2 文件加载 test1 得到的空对象,即 exports 指向的对象依旧是空的,所以你调用 test2() 会提示不是一个函数报错

产生这个现象的本质原因是 js 函数传参时 call-by-sharing 的形式引起的… 更多详细解释可以看这个:http://dmitrysoshnikov.com/ecmascript/chapter-8-evaluation-strategy/#call-by-sharing

@hyj1991 受教了,十分感谢!

@qqxwbtt 不客气~

来自酷炫的 CNodeMD

回到顶部