Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 非结构化变量值在模块之间不存在_Javascript_Node.js_Pass By Reference_Es6 Modules_Destructuring - Fatal编程技术网

Javascript 非结构化变量值在模块之间不存在

Javascript 非结构化变量值在模块之间不存在,javascript,node.js,pass-by-reference,es6-modules,destructuring,Javascript,Node.js,Pass By Reference,Es6 Modules,Destructuring,当在NodeJS应用程序中的模块之间传递对象时,我得到了不一致的结果,或者可能只是误解了正在发生的事情 在下面用伪代码编写的我的应用程序中,首先需要在应用程序根目录中输入一个lib文件,然后是应用程序使用的其他服务,这些服务也需要在同一个库中输入。然后在应用程序根目录中配置库-这将设置一个类变量(this.foo),该变量在库中初始化为空对象-最后调用其中一个服务中的方法 foo属性在服务文件的顶部被分解,如果我立即注销它,就会得到一个空对象(如预期的那样)。调用服务方法时,在别处配置foo并引

当在NodeJS应用程序中的模块之间传递对象时,我得到了不一致的结果,或者可能只是误解了正在发生的事情

在下面用伪代码编写的我的应用程序中,首先需要在应用程序根目录中输入一个lib文件,然后是应用程序使用的其他服务,这些服务也需要在同一个库中输入。然后在应用程序根目录中配置库-这将设置一个类变量(
this.foo
),该变量在库中初始化为空对象-最后调用其中一个服务中的方法

foo属性在服务文件的顶部被分解,如果我立即注销它,就会得到一个空对象(如预期的那样)。调用服务方法时,在别处配置foo并引用destructured属性后,仍然会得到一个空对象。相反,如果我不分解属性,只在库中要求(
Lib
),那么在我访问Lib.foo的方法中,我会看到配置的值(如预期的)

我的怀疑是,解构变量是一个没有被更新的值,所需的库是一个引用,但我读到的所有内容都表明,没有任何东西是通过值传递的。任何提示都将不胜感激

// main.js
// ========
const lib = require('./lib');
const service = require('./service');
lib.configure({ foo: "bar"});
service.run();


// service.js
// ========
const Lib = require('./lib');     // This is for the example only
const { foo } = require('./lib'); // I'd prefer to just do this

console.log(Lib.foo); // {} as expected
console.log(foo);     // {} as expected

class Service {
    run() {
        console.log(foo);    // {} - should be "bar"
        console.log(Lib.foo) // "bar" as expected
    }
}
module.exports = new Service();


// lib.js
// ======
class Lib {
    constructor() {
        this.foo = {};
    }
    configure({ foo }) {
        this.foo = foo;
    }
}
module.exports = new Lib();

这是正确的行为

它所做的是更新指向包含新值的新内存位置的指针,它不会更改我们当前指向的值

对于字符串等基本体,一般的实现是在变量重新赋值期间实际复制整个值

额外:这通常被称为

下面是一个例子:

var x=“123”//将名为“x”的变量指向包含字符串“123”的内存位置
变量y=x;//将名为“y”的变量指向一个新的内存位置,我们将数据从“x”指向的内存位置复制到该位置
x=“456”//将名为“x”的变量指向包含值“456”的新内存位置

控制台日志(y);//仍然是“123”,“y”仍然指向包含“123”副本的内存位置
,因此我认为您混淆了引用和值。{foo}的值不变而Lib.foo的值不变的原因是,在foo的情况下,您当时正在分配Lib.foo值的副本。如果您想对Lib的数据进行变异并将其传播,则需要使用对象(而不是像当前那样解构参数)


希望这有帮助

感谢您如此深入的回复,以及我能够理解的更多回复!我将坚持Lib.foo方法,而不是更新对象,但值得记住。很高兴帮助mate感谢Jack-与nem的观点相同,并且更容易理解,但由于附加细节,接受了nems的答案。