Node.js:模块导出,只有对象
我不明白为什么只有对象是不错的出口。 看那个:
第一个文件
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 };
为什么?
而出口的解决scheme是这样做的:
第一个文件:
... a.hello = 'help'; exports.b = 104; // (add exports) ...
第二个文件:
... var b = require('firstfile'); ... console.log(bb); // 104
为什么?
编辑
我想我明白了。
variablesa只是一个参考! 我会向不明白的人解释:
- 当第一个文件被读取时,
a = {}, b = 0
- 当我们改变b,b被改变了,而不是模块(出口)!
- 这是正常的,用
exports.b = 104
//我们改变模块的值! 谁是必需的。
现在,为什么对象是不同的?
- 因为当文件2被执行时。 (执行一次),a = {}的值。
- 但它显示{xxx:xxx}
- 这是因为文件执行时的值不是{},而是该对象的引用。
- 所以,当我们需要采取这个对象,我们search所有的参考。
记住两件事是重要的:
- 一个function所需的模块被读取一次! 需要在函数中要求查看更改。
- 对象库存参考。
再见! 希望这个帮助!
当你将0
赋值到exports.b
,它基本上被赋值为一个常量值。 您可以更新b
variables指向的值,但不会被重新导出。
例如,我通过添加一个getB
函数来修改您发布的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;
你说两个variables指向相同的值。 这与指向相同引用的两个variables(一个对象,就像您对a所做a
)不同。 当您修改一个值时,另一个值不会被修改。 换句话说,当您将0的值更改为1时,您不希望代码中的每个0
为1
。 那不好。
如果您希望b
是一个值,并且每次修改该值时都要更新,则应重新分配exports.b
。 这是为什么你会看到大多数代码作为一个对象被导出的一部分…然后,你的出口被视为一个引用,所有的b
都按预期更新。