考虑这两个程序:
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”。我希望它能打印出“猫狗”。为什么要打印“猫猫”,如何打印“猫狗”?
答案 0 :(得分:3)
我认为这里的问题是two.animal
和var 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;