为什么我不能在Node.js中将另一个文件中的导出变量设置为另一个文件?

时间:2016-08-02 18:49:54

标签: javascript node.js

考虑这两个程序:

testing1.js:

'use strict';
var two=require('./testing2');

two.show();
two.animal='Dog';
two.show();

testing2.js:

'use strict';
var animal='Cat';

function show()
   {
   console.log(animal);
   }

module.exports.animal=animal;
module.exports.show=show;

当我在Node.js中运行它时,它会打印“Cat Cat”。我希望它能打印出“猫狗”。为什么要打印“猫猫”,如何打印“猫狗”?

2 个答案:

答案 0 :(得分:3)

我认为这里的问题是two.animalvar animal是两个不同的变量。 show函数始终记录var animal

中定义的testing2.js

对于testing2.js我会做这样的事情:

'use strict';

module.exports = {
    animal: 'Cat',
    show: function () {
        console.log(this.animal); // note "this.animal"
    }
}

然后在testing1.js

'use strict';

var two = require('./testing2.js');

two.show(); // => Cat
two.animal = 'Dog'; // now replaces 'Cat'
two.show(); // => Dog

答案 1 :(得分:0)

我想我找到了自己问题的答案。 Javascript总是按值传递变量,而不是通过引用传递 - 当然除非它是一个对象或函数,其中“value”是一个引用。当我将 animal 变量复制到module.exports.animal时,它实际上并不复制该变量,而是复制单词“Cat”。更改导出的变量不会影响原始动物变量。 我没有在testing2.js中导出变量,而是创建了一个setter。导出setter并使用它而不是尝试直接设置 animal 使它的行为符合我的需要。

testing1.js:

'use strict';
var two=require('./testing2');

two.show();
two.setAnimal('Dog');
two.show();

testing2.js:

'use strict';
var animal='Cat';

function show()
   {
   console.log(animal);
   }

function setAnimal(newAnimal)
   {
   animal=newAnimal;
   }

module.exports.setAnimal=setAnimal;
module.exports.show=show;