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

时间:2012-05-17 17:55:40

标签: 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

};

为什么?

和出口b的解决方案是这样的:

第一个文件:

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

第二档:

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

为什么?

修改

我想我明白了。

变量a只是一个参考! 我会向不理解的人解释:

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

现在,为什么对象不同?

  • 因为执行文件2时。 (执行一次),a = {}。
  • 的值
  • 但显示{xxx:xxx}
  • 这是因为执行文件时a的值不是{},而是该对象的引用。
  • 因此,当我们需要获取此对象时,我们会搜索所有引用。

记住两件事很重要:

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

再见! 希望这有帮助!

1 个答案:

答案 0 :(得分:1)

0分配给exports.b时,它实际上被指定为常量值。您可以更新b变量指向的值,但不会重新导出。

例如,我通过添加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;

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

如果您希望b成为值并在每次修改该值时更新,则应重新分配exports.b。这就是为什么您会将大多数代码视为一个正在导出的对象的原因之一...然后,您的导出将被视为参考,并且您的所有b都会按预期更新。