我想我最能解释一下我对代码的困惑:
var options = {};
exports.options = options;
exports.options.a = 'a';
console.log(exports.options, options);
exports.options = {};
console.log(options, exports.options);
在第一个输出上:
{ a: 'a' } { a: 'a' }
很好,看起来对exports.options
所做的任何操作都会对options
完成!但在第二个输出上:
{ a: 'a' } {}
发生什么事了?为什么options
也不是{}
?我能做些什么?#34;空" exports.options
也会清空options
?
同样如下:
options = {};
console.log(options, exports.options);
哪个输出:
{} { a: 'a' }
答案 0 :(得分:1)
当你这样做时,
exports.options = options;
您要将与options
关联的对象的参考分配给exports.options
。
再次更改时,
exports.options = {};
您正在为exports.options
分配新引用而不更改options
。
答案 1 :(得分:0)
您可以通过以下代码了解
var options = {}; // Let's say Ref1
exports.options = options; // Ref1 passed to exports.options
exports.options.a = 'a'; // still Ref1
console.log(exports.options, options); // So both will be updated
exports.options = {}; // New reference say Ref2, which has nothing to do with Ref1
console.log(options, exports.options); // Therefore changing Ref2 doesn't affect Ref1
当您执行exports.options = {};
时,将销毁第一个引用并存储新引用,该引用绝不会连接到第一个引用。因此options
具有单独的引用,仍然代表{a : 'a'}
不会受到影响。
答案 2 :(得分:0)
在处理引用变量(包括指向对象的变量)时,将变量视为包含值的框会有所帮助。
您从一个名为options
的框中开始,该框中包含一个空对象。您还有一个名为exports
的框。在exports
框内,您放置了名为options
的另一个框... ...包含options
包含的相同对象(这是物理框类比开始的地方)是紧张的,但想象一下,两个盒子可以包含相同的物理内容。)
变量名称只是写在框中的名称。所以现在你有三个盒子:
options
(我随意称之为X)exports
的邮箱
options
的框,其中还包含对象X 当您执行作业exports.options = {}
时,您所做的只是在该框中添加不同的内容,在本例中为新对象Y.所以现在您已经:
包含空对象X的框options
(我随意称它为X)
框exports
包含...
另一个标有options
的框,其中包含对象Y
因此,您可以看到options
和exports.options
选项指向不同的内容,即使它们的名称相同。