Node.js:模块导出,只有对象

我不明白为什么只有对象是不错的出口。 看那个:

第一个文件

var a = exports.a = {}; var b = exports.b = 0; exports.xxxxx = function(){ a.hello = 'help'; b = 104; }; 

第二个文件

 var a = require('firstfile').a; var b = require('firstfile').b; module.exports = function(){ console.log(a); // {hello:'help'} console.log(b); // 0 }; 

为什么?

而出口的解决scheme是这样做的:

第一个文件:

 ... a.hello = 'help'; exports.b = 104; // (add exports) ... 

第二个文件:

 ... var b = require('firstfile'); ... console.log(bb); // 104 

为什么?

编辑

我想我明白了。

variablesa只是一个参考! 我会向不明白的人解释:

  • 当第一个文件被读取时, a = {}, b = 0
  • 当我们改变b,b被改变了,而不是模块(出口)!
  • 这是正常的,用exports.b = 104 //我们改变模块的值! 谁是必需的。

现在,为什么对象是不同的?

  • 因为当文件2被执行时。 (执行一次),a = {}的值。
  • 但它显示{xxx:xxx}
  • 这是因为文件执行时的值不是{},而是该对象的引用。
  • 所以,当我们需要采取这个对象,我们search所有的参考。

记住两件事是重要的:

  • 一个function所需的模块被读取一次! 需要在函数中要求查看更改。
  • 对象库存参考。

再见! 希望这个帮助!

当你将0赋值到exports.b ,它基本上被赋值为一个常量值。 您可以更新bvariables指向的值,但不会被重新导出。

例如,我通过添加一个getB函数来修改您发布的getB

 var a = exports.a = {}; var b = exports.b = 0; exports.xxxxx = function(){ a.hello = 'help'; b = 104; }; exports.getB = function() { return b; }; 

然后,你可以在REPL中看到这个文件的含义:

 > var example = require('./example.js'); undefined > example { a: {}, b: 0, xxxxx: [Function], getB: [Function] } > example.xxxxx() undefined > example.getB() 104 > example.b 0 > 

编辑:你的评论有关引用是有点正确的。 当你最初说

 var b = exports.b = 0; 

你说两个variables指向相同的值。 这与指向相同引用的两个variables(一个对象,就像您对a所做a )不同。 当您修改一个值时,另一个值不会被修改。 换句话说,当您将0的值更改为1时,您不希望代码中的每个01 。 那不好。

如果您希望b是一个值,并且每次修改该值时都要更新,则应重新分配exports.b 。 这是为什么你会看到大多数代码作为一个对象被导出的一部分…然后,你的出口被视为一个引用,所有的b都按预期更新。