Javascript 非结构化变量值在模块之间不存在
当在NodeJS应用程序中的模块之间传递对象时,我得到了不一致的结果,或者可能只是误解了正在发生的事情 在下面用伪代码编写的我的应用程序中,首先需要在应用程序根目录中输入一个lib文件,然后是应用程序使用的其他服务,这些服务也需要在同一个库中输入。然后在应用程序根目录中配置库-这将设置一个类变量(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并引
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的答案。