node.js - 了解变量引用的导出行为

时间:2015-09-03 01:42:47

标签: javascript node.js

有人可以帮我理解下面场景中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。

有人可以解释一下吗?

2 个答案:

答案 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,您必须为其分配。