// x.js
const {function1}=require('./y');
const function2=()=>{
console.log('from function 2 ');
function1()
}
function2();
module.exports={function2}
// y.js
const {function2}=require('./x');
const function1=()=>{
console.log('hello from function1');
function2();
}
module.exports={function1};
当我运行x.js文件时,y.js中的function2不会执行,并且抛出一个类型错误,表示function2不是函数。
node testing/x.js
from function 2
hello from function1
/media/xyz/9A2A71AB2A718553/abc/ghf/testing/y.js:6
function2();
^
TypeError: function2 is not a function
at function1 (/media/xyz/9A2A71AB2A718553/abc/ghf/testing/y.js:6:3)
at function2 (/media/xyz/9A2A71AB2A718553/abc/ghf/testing/x.js:5:3)
at Object.<anonymous> (/media/xyz/9A2A71AB2A718553/abc/ghf/testing/x.js:7:1)
at Module._compile (module.js:649:30)
at Object.Module._extensions..js (module.js:660:10)
at Module.load (module.js:561:32)
at tryModuleLoad (module.js:501:12)
at Function.Module._load (module.js:493:3)
at Function.Module.runMain (module.js:690:10)
at startup (bootstrap_node.js:194:16)
答案 0 :(得分:2)
我不确定您对模块有多了解,但您可能会发现this answer of mine on SoftwareEngineering.SE helpful。当您在require('./x')
内y.js
时,您会从exports
模块中获取正在进行的,部分构建的 x
对象。在x
需要y
时,x
尚未向其导出对象添加function2
,并且在调用{{1}之前不会这样做完成后,它可以执行require('./y')
中的最后一行。
换句话说,重复调用x.js
不会重新运行模块require('foo')
中的代码。相反,它们会生成已为foo
创建的唯一module.exports
。即使foo
尚未运行完成,模块也会在第一次foo
d时创建一个不完整的module.exports
对象。
这里的技巧不是覆盖require
对象,而只是添加方法。
x.js
module.exports
y.js
const {function1}=require('./y');
const function2=()=>{
console.log('from function 2 ');
function1()
}
module.exports.function2 = function2;
function2();
通过在const xModule = require('./x');
const function1=()=>{
console.log('hello from function1');
xModule.function2();
}
module.exports={function1};
中执行xModule = require('./x')
和xModule.function2()
,我们允许y.js
等到function1
模块已定义x
并添加它到function2
对象。
我们还必须将module.exports
内的function2()
调用移至x.js
创建的下方,因为拨打module.exports.function2
会调用{{1} }},期望function2
模块已在function1
上使用x
方法。