gpt4 book ai didi

Node.js : module exports, 唯一对象

转载 作者:行者123 更新时间:2023-12-02 07:27:46 24 4
gpt4 key购买 nike

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

第一个文件

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

记住两件事很重要:

  • 函数所需的模块被读取一次!需要在函数中进行 require 才能看到更改。
  • 对象库存引用。

再见!希望这有帮助!

最佳答案

当您将 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 都会按预期更新。

关于Node.js : module exports, 唯一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com