今天代码遇到方法未定义has no method问题。发现是循环引用的问题。
nodejs在遇到循环require时,会把require结果得到的结果变成空对象{}。这个结果包括的是循环引用链中的每一个。
例子:
a.js
console.log('a.js');
var b = require('./b');
console.log('a+.js');
console.log(b);
exports={name:'a'};
console.log('a++.js');
b.js
console.log('b.js');
var c = require('./c');
console.log('b+.js');
console.log(c);
exports={name:'b'};
console.log('b++.js');
c.js
console.log('c.js');
var a = require('./a');
console.log('c+.js');
console.log(a);
exports={name:'c'};
console.log('c++.js');
然后我执行
node a.js
打印如下:
a.js
b.js
c.js
c+.js
{}
c++.js
b+.js
{}
b++.js
a+.js
{}
a++.js
可以看到node会按引用链引用,直到发现循环引用了为止。
然后开始回溯,所有的代码都会执行到。
唯一不同的是所有循环链中require的结果都是空对象{}.