今天遇到一个问题求解释,我打了个测试代码复现: 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吗。。
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 受教了,十分感谢!