有人可以帮我理解下面场景中node.js export。*变量引用的行为吗?
ConfigIndex.js
GLOBAL.app_configs = require('./myconfigs.json');
exports.port = GLOBAL.app_configs.port;
exports.updateConfig = function(newconfigJSONObject, callback)
{
GLOBAL.app_configs = newconfigJSONObject;
callback("update complete");
});
myconfigs.json
{
"port": 443
}
app.js
var config = require('./ConfigIndex.js');
console.log(config.port); //PRINTS the value 443
config.updateConfig ({"port": 9999}, function(resOut) {
console.log(config.port); //PRINTS the value 443 again but I expected 9999
});
- 问题 -
当运行app.js config.port输出443但是在调用config.updateConfig函数之后,当我期望值9999时,config.port仍会输出443。
有人可以解释一下吗?
答案 0 :(得分:1)
执行此操作时:
exports.port = GLOBAL.app_configs.port;
因为.port
只是一个数字,exports.port
只包含该数字的副本。它不再以任何方式与GLOBAL.app_configs.port
建立任何关联,因此无论您将GLOBAL.app_configs.port
更改为什么,它对完全独立的变量exports.port
都没有任何影响。
也许这可能会让它变得更加明显:
var x = 3; // assign primitive value 3 to x
var y = x; // copy the primitive value 3 from x to y
x = 4; // assign primitive value 4 to x
console.log(x); // shows 4
console.log(y); // shows 3
在Javascript中,数字等原始值在赋值时按值分配,并成为单独的值(您可以将其视为将值复制到新变量中)。
Javascript中的对象是由指针指定的,这可能会让您认为它可能具有您期望的行为,但不会像数字这样的原语。
因此,以您显示的方式更改值的唯一方法是在对象中嵌入属性并保留对变量中对象的引用。然后,当有人更改该对象中的属性然后引用该属性时,您将看到更改的值。
答案 1 :(得分:0)
JavaScript是pass/assign by value。如果你有
var foo = 42;
var bar = foo;
然后为foo
分配一个新值,例如
foo = 21;
不会神奇地更新bar
。
JavaScript的工作方式,与exports
或Node无关。
要更新exports.port
,您必须为其分配。