3

我不明白为什么只有对象可以很好地导出。看那个:

第一个文件

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的值不是{},而是这个对象的引用。
  • 因此,当我们需要获取这个对象时,我们会搜索所有引用。

重要的是要记住两件事:

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

再见!希望这有帮助!

4

1 回答 1

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' 都按预期更新。

于 2012-05-17T19:46:19.133 回答