刚才撸代码调用一个变量,这个变量被暴露出去在其他文件改变了它的值,但是本文件调用时发现并没有改变,看了半天发现了一个问题。
新建一个a.js

1
2
3
4
5
6
const b = require('./b');

console.log(b.foo); // 1

b.foo = 233;

新建b.js

1
2
3
4
5
6
7
8
9
var foo = 1;

module.exports.foo = foo;

setTimeout(() => {
console.log(foo); //1
console.log(exports.foo); //233
console.log(module.exports.foo); //233
}, 1000);

使用node a.js启动,a.js先输出 1 然后b.js一秒后输出 1 ,233,233。
所以为什么b.js的console.log(foo)输出是1呢。。暂时不清楚,看下一个列子:

新建a.js

1
2
3
4
5
6
const b = require('./b');

console.log(b.foo.a);

b.foo.a = 233;

新建b.js

1
2
3
4
5
6
7
8
9
10

var foo = { a: 1 }

module.exports.foo = foo;

setTimeout(() => {
console.log(foo.a); //233
console.log(exports.foo.a); //233
console.log(module.exports.foo.a); //233
}, 1000);

这里的foo是一个对象,里面有键值对a:1,这时猜猜b.js输出是什么,bingo,当然是233了。。。
这里也许知道为什么上面的变量值没有改变了。。也许传值和传引用在暴露变量也生效了。暴露一个变量 可以不用var而直接exports一个变量。

1
module.exports.a = 1;

所以对于传值来说,在暴露之前声明变量就没有什么意义了。反正调用的时候都要带上前面的一坨。。。

>>>Demo github传送门